我需要在 Mac OSX(内核模式驱动程序)上使用类似工作队列的功能,并且正在寻找一种将工作添加到队列中以便稍后由内核线程处理的方法。从概念上讲,这与 Linux 内核中可用的工作队列功能相同。XNU内核上也有类似的东西吗?
1 回答
我不认为有直接的等价物,尽管我承认我对 Linux 方面并不十分熟悉,所以我将避免比较,只是告诉你 macOS/xnu 上可用的内容。
I/O 套件 IOWorkLoops
如果您正在构建 I/O Kit 驱动程序,尤其是在编写辅助中断处理程序时,您将使用IOWorkLoops。中断由 IOEventSource 对象抽象,这些对象安排辅助中断处理程序在驱动程序的 IOWorkLoop 上运行。
每个都IOWorkLoop
包装一个内核线程,并为与该线程共享的资源提供序列化/锁定机制。所有直接通过一个IOCommandGate
或工作循环对象显式提交到工作循环的作业,或者作为IOEventSource
事件的结果将被序列化。请注意,IOCommandGate
作业将在调用线程上同步运行,而不是在工作循环线程上。
与 macOS/OSX 内部一样,您需要查看头文件注释以及可能在 xnu 源代码中的实现以获取详细信息。我个人觉得IOWorkLoop
某些任务有点笨拙,但如果你正在处理 PCI 设备等,你真的别无选择。
线程调用
更轻量级的后台工作机制是thread_call API。它在<kern/thread_call.h>
操作系统管理的后台线程中定义并支持运行函数,可选延迟后或具有特定优先级。这可能更接近于您从 Linux 中了解的内容,具有相当简单的 API,但不适合辅助中断处理程序。