在xnu内核中有一个workqueue功能吗?

时间:2017-09-21 01:19:59

标签: macos kernel iokit kernel-extension xnu

我需要在Mac OSX(内核模式驱动程序)上使用类似工作队列的功能,并且正在寻找一种方法将工作添加到队列中以便稍后由内核线程处理。从概念上讲,这与Linux内核中可用的工作队列功能相同。 XNU内核上也有类似的东西吗?

1 个答案:

答案 0 :(得分:0)

我不认为这有直接的等价,虽然我承认我并不熟悉Linux方面,所以我会避免比较,只是告诉你macOS / xnu上有什么可用。

I / O Kit 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内部一样,您需要查看头文件注释以及可能在xnu源中的实现以获取详细信息。我个人认为IOWorkLoop对于某些任务来说有点笨拙,但是如果你正在处理PCI设备等,你真的没有选择。

<强> thread_call

更轻量级的后台工作机制是thread_call API。它在<kern/thread_call.h>中定义,并支持在OS管理的后台线程上运行函数,可选地在延迟或具有特定优先级之后。这可能更接近你所知道的Linux,有一个相当简单的API,但不适合辅助中断处理程序。