编写一个处理任意中断和输出到设备的 FreeBSD 内核模块

Posted

技术标签:

【中文标题】编写一个处理任意中断和输出到设备的 FreeBSD 内核模块【英文标题】:Writing a FreeBSD kernel module that handles arbitrary interrupt and output to device 【发布时间】:2017-12-04 23:30:02 【问题描述】:

我想编写一个 FreeBSD 内核模块,它可以接受一些任意中断,并在收到这些中断后,将一些数据输出到任意设备。目前,我面临几个问题:

    如何通过特定的 IRQ 获取中断?在 Linux 上,有 request_irq() 调用,但似乎没有类似的用于 FreeBSD 的 API ...说,我希望能够通过我的内核模块检测所有键盘中断(键盘在 irq1 上),我该怎么做那? (在 Linux 上,可以通过调用 free_irq(1, NULL)request_irq(1, ...),如果我错了,请纠正我。

    是否可以通过内核模块写入 /dev 下的设备文件?我已阅读问题Example for reading text files in FreeBSD kernel module;按照这个示例,我能够对常规文件进行读/写,但不能对 /dev 下的设备文件进行读/写(“设备”是伪 "echo device",这是 char 设备示例中使用的经典文件)。虽然我能够打开文件。 我确实理解在内核中执行文件 I/O 被认为是一种不好的做法,但我想不出任何其他方式......如果有人有更好的解决方案,请告诉我。 (即通过其device_t 节点写入设备?)

我在内核中这样做的原因是我确实需要触发所有中断,并且在用户空间中运行它有由于内核线程抢占用户线程而丢失中断的风险(中断可能非常频繁)。

如果有人能提供一些关于如何实现这个程序的其他想法,我也将不胜感激(基本上,这个想法是一个可以完成微控制器工作的内核模块......)

【问题讨论】:

你很勇敢很勇敢。 【参考方案1】:

您可以使用bus_setup_intr 注册一个 IRQ 处理程序。

通常情况下,在这种情况下会做的是让驱动程序收集中断和任何其他有用的数据,并通过设备将其导出,然后用户空间中的(可能是实时的?)进程可以读取从一个设备,做它需要做的任何事情,然后写入另一个设备。

【讨论】:

以上是关于编写一个处理任意中断和输出到设备的 FreeBSD 内核模块的主要内容,如果未能解决你的问题,请参考以下文章

中断处理程序不能使用printf的本质

输入输出与中断

10.5 外部中断的处理过程

《Linux设备驱动程序》(十六)-中断处理

设备驱动中的并发控制

中断和异常