1. ACPI链表处理机制解析
在Windows内核的ACPI子系统实现中,AcpiBuildRunMethodList和AcpiBuildQueueList这两个链表承担着关键的任务调度功能。前者用于存放待执行的控制方法(Control Methods),后者则作为待处理请求的缓冲队列。这种双链表设计是ACPI驱动实现异步处理的核心机制。
1.1 链表结构定义与作用
从调试信息中可以看到,链表节点采用标准的_LIST_ENTRY结构:
cpp复制typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY;
当调试器显示tempEntry = 0xf743b870且Flink/Blink都指向自身地址时,表明AcpiBuildRunMethodList已成为空链表。这种自引用是Windows内核链表为空时的典型特征。
注意:在分析链表状态时,需要特别关注SpinLock(如
AcpiBuildQueueLock)的保护范围。从代码片段可知,操作AcpiBuildQueueList前必须获取该锁。
1.2 状态机流转逻辑
ACPI驱动使用workDone标志位来标识任务完成状态:
WORK_DONE_COMPLETE:方法执行成功WORK_DONE_FAILURE:方法执行失败STATUS_PENDING:方法正在异步执行
当ACPIBuildProcessGenericList()返回STATUS_SUCCESS时,驱动会检查AcpiBuildQueueList是否为空。若不为空,则设置AcpiBuildWorkDone = TRUE触发后续处理:
cpp复制if (!IsListEmpty(&AcpiBuildQueueList)) {
AcpiBuildWorkDone = TRUE;
continue;
}
这种设计实现了类似"生产者-消费者"的模式:
- 生产者:将新请求插入
AcpiBuildQueueList - 消费者:
