Mac OSX (커널 모드 드라이버)에서 workqueue와 유사한 기능을 사용해야하고 나중에 커널 스레드가 처리 할 큐에 작업을 추가하는 방법을 찾고 있습니다. 개념적으로 이것은 리눅스 커널에서 사용할 수있는 workqueue 기능과 동일합니다. XNU 커널에도 비슷한 것이 있습니까?xnu 커널에 workqueue 기능이 있습니까?
답변
나는 리눅스 측에 친숙하지 않다는 것을 인정하지만 직접 비교할만한 것은 없다고 생각한다. 그래서 나는 비교하지 않고 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
작업은 동기식으로 스레드 (workloop 스레드가 아님)에서을 실행합니다.
언제나 macOS/OSX 내부에서와 마찬가지로 xnu 소스의 헤더 파일 주석 및 구현을 자세히보고 싶을 것입니다. 개인적으로는 IOWorkLoop
이 약간의 작업에 대해 다소 어색하지만 PCI 장치 등을 다루는 경우에는 선택의 여지가 없습니다.
는
thread_call 더 가벼운 배경 작업 메커니즘은 thread_call API입니다. <kern/thread_call.h>
에 정의되어 있으며 OS 관리 백그라운드 스레드에서 실행 기능을 지원합니다 (선택적으로 지연 또는 특정 우선 순위 이후). 이것은 아마도 리눅스에서 알고있는 것에 더 가깝고, 상당히 간단한 API를 가지고 있지만, 2 차 인터럽트 핸들러에는 적합하지 않습니다.