【问题标题】:How to trigger a function in kernel module interrupt如何在内核模块中断中触发函数
【发布时间】:2018-08-15 22:31:18
【问题描述】:
我正在尝试编写一个 linux 内核模块,它等待硬件触发,然后通过 DMA 将一些数据移动到外部存储器。
我已经在我的内核模块中识别了硬件触发器,现在我需要让它执行 DMA。问题是执行 DMA 的函数涉及到它在 DMA 完成之前休眠的点。这在中断中是不允许的,所以我不能直接在我的中断服务例程中调用该函数。
有没有一种方法可以设置某种信号,以便我的内核模块知道下次有机会调用 DMA 函数,但在中断上下文中不这样做?
【问题讨论】:
标签:
linux
kernel
interrupt-handling
【解决方案1】:
建议您通过注册回调来使用下半部分。
Linux 以这种方式工作,上半部分/下半部分。
上半部分服务中断并清除中断控制寄存器,并将注册的回调排队,即你的下半部分,它可以休眠。
建议您在 robert love 的书中阅读有关它的内容。这是一个很好的起点。
https://doc.lagout.org/operating%20system%20/linux/Linux%20Kernel%20Development%2C%203rd%20Edition.pdf
检查 linuxkernel org 源上的任何 i2c 客户端驱动程序以供参考。
https://elixir.bootlin.com/linux/latest/source/drivers/misc/fsa9480.c#L394
在那里注册您的回调以进行 DMA 后数据处理。
这只是关于下半部分如何帮助您开发驱动程序的要点。
希望对你有帮助。