我想编写一个 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" ,字符设备示例中使用的经典文件)。不过,我能够打开该文件。
我知道在内核中执行文件 I/O 被认为是一种不好的做法,但我想不出任何其他方式……如果有人有更好的解决方案,请告诉我。 (即通过其device_t
节点写入设备?)
我在内核中这样做的原因是我确实需要命中所有中断,并且在用户空间中运行它有丢失中断的风险,因为内核线程抢占了用户线程(中断可能会非常频繁).
如果有人能向我提供一些关于如何实现这个程序的其他想法,我也将不胜感激(基本上,这个想法是一个可以完成微 Controller 工作的内核模块......)
最佳答案
您可以使用 bus_setup_intr
注册一个 IRQ 处理程序.
通常,在这种情况下我们会做的是让一个驱动程序收集中断和任何其他有用的数据,并通过一个设备导出它,然后用户空间中的一个(也许是实时的?)进程可以读取从一台设备执行它需要做的任何事情,然后写入另一台设备。
关于c - 编写处理任意中断和输出到设备的 FreeBSD 内核模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44856038/