1. ACPI上下文调度机制深度解析
在Windows内核的ACPI子系统实现中,存在一套精密的上下文调度机制,用于管理各种ACPI操作(如设备配置、电源状态转换等)的执行流程。这套机制的核心在于三个关键函数:RestartContext、RestartCtxtCallback和DispatchCtxtQueue,它们共同构成了ACPI操作执行的完整生命周期。
1.1 上下文数据结构剖析
从调试信息中可以看到,ACPI上下文的核心数据结构是CTXT结构体,它包含了执行ACPI操作所需的所有信息:
c复制ACPI!CTXT
+0x000 dwSig : 0x54585443 // "CTXT"签名
+0x004 pbCtxtEnd : 0x8997e000 // 上下文结束地址
+0x008 listCtxt : _List // 上下文链表节点
+0x010 listQueue : _List // 就绪队列链表节点
+0x018 pplistCtxtQueue : (null) // 指向所属队列的指针
+0x01c plistResources : 0x8997c198 // 资源列表
+0x020 dwfCtxt : 0x120 // 上下文标志位
+0x024 pnsObj : 0x899b4938 // ACPI命名空间对象
+0x028 pnsScope : 0x899b40ac // 当前作用域
+0x02c powner : 0x8997c1ac // 所有者对象
+0x030 pcall : 0x8997dd18 // 调用信息
+0x034 pnctxt : (null) // 下一个上下文
+0x038 dwSyncLevel : 0xf // 同步级别
+0x03c pbOp : 0x899b4122 // 操作码指针
+0x040 Result : _ObjData // 操作结果
+0x054 pfnAsyncCallBack : 0xf7407364 // 异步回调函数
+0x058 pdataCallBack : 0x899c634c // 回调数据
+0x05c pvContext : 0x899c6320 // 回调上下文
+0x060 Timer : _KTIMER // 内核定时器
+0x088 Dpc : _KDPC // 延迟过程调用
+0x0a8 pheapCurrent : 0x8997c0bc // 当前堆
+0x0ac CtxtData : _ctxtdata // 上下文数据
+0x0bc LocalHeap : _heap // 本地堆
这个结构体有几个关键点需要注意:
dwSig字段用于验证结构体有效性,值为"CTXT"的ASCII码listQueue用于将上下文挂入就绪队列(gReadyQueue)pplistCtxtQueue指向所属队列的头指针,执行时会验证其有效性dwfCtxt包含各种状态标志,如CTXTF_IN_READYQ表示上下文在就绪队列中
