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



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

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

  2. 是否有可能通过内核模块写入/dev 下的设备文件?我已经阅读了问题 在 FreeBSD 内核模块中读取文本文件的示例;按照这个例子,我能够对常规文件进行读/写,但不能对/dev 下的设备文件进行读/写("设备"是一个伪"回显设备",是 char 设备示例中使用的经典设备(。不过我能够打开文件。
    我确实知道在内核中执行文件 I/O 被认为是一种不好的做法,但我无法想到任何其他方法......如果有人有更好的解决方案,请告诉我。(即通过其device_t节点写入设备?

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

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

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

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

最新更新