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

问题描述 投票:0回答:2

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

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

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

linux kernel interrupt-handling
2个回答
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 后数据处理的回调。

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


0
投票

您可以从上半部中断处理程序调用下半部例程,它可以像工作队列一样休眠:

因为workqueue允许用户创建内核线程并绑定work 到内核线程。因此,这将在进程上下文中运行并且 工作队列可以休眠。推迟到工作队列的代码具有所有常见的功能 流程上下文的好处。最重要的是,工作队列是 可调度,因此可以睡眠。

另一种方法,您可以使用线程中断,其调度方式与用户空间进程相同,因此也可以休眠:

注册线程中断

© www.soinside.com 2019 - 2024. All rights reserved.