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

标签 c unix kernel freebsd bsd

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

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

  2. 是否可以通过内核模块写入/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/

相关文章:

linux - 帮助查找和替换字符串的 Shell 脚本

有人可以帮助如何在多个函数中声明 int 吗? C

c - linux 中的 gui 使用 gcc

c - 线程和进程之间的文件锁定

linux - 在 linux 中获取页面的 pte

operating-system - 从使用 GRUB/NASM/C 构建的内核生成 ISO

c - 如何修复错误 : passing argument 4 of 'proc_create' from incompatible pointer type

c++ - 重载 malloc 以跟踪第三方库的内存使用情况

c - 使用互斥锁进行 Pthread 同步

bash - 在 shell 脚本中定义一个 Increment 变量,该变量在每个 cronjob 上递增