Linux 如何在内核模块中断中触发函数

Linux 如何在内核模块中断中触发函数,linux,kernel,interrupt-handling,Linux,Kernel,Interrupt Handling,我正在尝试编写一个linux内核模块,它等待硬件触发,然后通过DMA将一些数据移动到外部内存 我已经在我的内核模块中识别了硬件触发器,现在我需要让它执行DMA。问题在于,执行DMA的函数涉及到一个点,在该点上它将休眠,直到DMA完成。这在中断中是不允许的,因此我不能在中断服务例程中直接调用该函数 有没有一种方法可以设置某种信号,使我的内核模块知道下次调用DMA函数,但在中断上下文中不这样做?建议您通过注册回调来使用下半部分。 Linux是这样工作的,上半部分/下半部分 上半部分服务于中断和清除中

我正在尝试编写一个linux内核模块,它等待硬件触发,然后通过DMA将一些数据移动到外部内存

我已经在我的内核模块中识别了硬件触发器,现在我需要让它执行DMA。问题在于,执行DMA的函数涉及到一个点,在该点上它将休眠,直到DMA完成。这在中断中是不允许的,因此我不能在中断服务例程中直接调用该函数


有没有一种方法可以设置某种信号,使我的内核模块知道下次调用DMA函数,但在中断上下文中不这样做?

建议您通过注册回调来使用下半部分。 Linux是这样工作的,上半部分/下半部分

上半部分服务于中断和清除中断控制寄存器,并对已注册的回调(即下半部分)进行排队,它可以睡眠

我建议你读一本罗伯特·洛夫的书。这是一个很好的开始

https://doc.lagout.org/operating%20system%20/linux/Linux%20Kernel%20Development%2C%203rd%20Edition.pdf
检查LinuxKernelOrg源代码上的任何i2c客户端驱动程序以供参考

https://elixir.bootlin.com/linux/latest/source/drivers/misc/fsa9480.c#L394
在那里注册用于DMA后期数据处理的回调

这只是关于下半部如何帮助您开发驱动程序的要点。 希望它能对您有所帮助。

可能是一个很好的指针: