我需要在Mac (内核模式驱动程序)上使用类似工作队列的功能,并且正在寻找一种方法来将工作添加到队列中,以便稍后由内核线程处理。从概念上讲,这与Linux内核中提供的工作队列功能是相同的。XNU内核上也有类似的东西吗?
发布于 2017-09-21 21:18:45
我不认为有直接的等价物,尽管我承认我对Linux方面不是很熟悉,所以我将避免比较,只告诉你macOS/xnu上有什么可用。
I/O工具包IOWorkLoops
如果您正在构建一个I/O工具包驱动程序,特别是如果您正在编写一个辅助中断处理程序,那么您将使用IOWorkLoops。中断are abstracted by IOEventSource objects, which schedule secondary interrupt handlers to run on the driver's IOWorkLoop。
每个IOWorkLoop包装一个内核线程,并为与该线程共享的资源提供序列化/锁定机制。所有通过IOCommandGate或直接通过工作循环对象提交给工作循环的作业,或者作为IOEventSource事件的结果,都将被序列化。注意,IOCommandGate作业将在调用线程上同步运行,而不是在工作循环线程上。
与macOS/OSX内部机制一样,您需要查看头文件注释,可能还需要查看xnu源代码中的实现,以了解详细信息。我个人发现PCI对于某些任务来说有点笨拙,但是如果你正在处理IOWorkLoop设备等,你就没有选择的余地了。
thread_call
一种更轻量级的后台工作机制是thread_call API。它是在<kern/thread_call.h>中定义的,支持在操作系统管理的后台线程上运行函数,可以选择在延迟后运行,也可以使用特定的优先级运行。这可能更接近您对Linux的了解,具有相当简单的API,但不适合辅助中断处理程序。
https://stackoverflow.com/questions/46333931
复制相似问题