【发布时间】:2017-09-21 01:19:59
【问题描述】:
我需要在 Mac OSX(内核模式驱动程序)上使用类似工作队列的功能,并且正在寻找一种将工作添加到队列中以供内核线程稍后处理的方法。从概念上讲,这与 Linux 内核中可用的工作队列功能相同。 XNU内核上也有类似的东西吗?
【问题讨论】:
标签: macos kernel iokit kernel-extension xnu
我需要在 Mac OSX(内核模式驱动程序)上使用类似工作队列的功能,并且正在寻找一种将工作添加到队列中以供内核线程稍后处理的方法。从概念上讲,这与 Linux 内核中可用的工作队列功能相同。 XNU内核上也有类似的东西吗?
【问题讨论】:
标签: macos kernel iokit kernel-extension xnu
我不认为有直接的等价物,虽然我承认我对 Linux 方面并不十分熟悉,所以我将避免比较,只是告诉你 macOS/xnu 上可用的内容。
I/O 套件 IOWorkLoops
如果您正在构建 I/O Kit 驱动程序,尤其是在编写辅助中断处理程序时,您将使用IOWorkLoops。中断are abstracted by IOEventSource objects, which schedule secondary interrupt handlers to run on the driver's IOWorkLoop。
每个IOWorkLoop 包装一个内核线程,并为与该线程共享的资源提供序列化/锁定机制。通过IOCommandGate 或直接通过workloop 对象显式提交到工作循环的所有作业,或作为IOEventSource 事件的结果将被序列化。请注意,IOCommandGate 作业将在 调用 线程上同步运行,而不是在工作循环线程上运行。
与 macOS/OSX 内部一样,您需要查看头文件 cmets 以及可能在 xnu 源代码中的实现以了解详细信息。我个人觉得IOWorkLoops 对于某些任务来说有点笨拙,但如果你正在处理 PCI 设备等,你真的别无选择。
thread_call
更轻量级的后台工作机制是thread_call API。它在<kern/thread_call.h> 中定义,支持在操作系统管理的后台线程上运行函数,可以选择在延迟之后或以特定优先级运行。这可能更接近您从 Linux 中了解的内容,具有相当简单的 API,但不适合辅助中断处理程序。
【讨论】: