1. ACPI设备命名空间对象创建机制解析
在ACPI(高级配置与电源管理接口)的实现中,设备对象的创建和命名空间管理是核心功能之一。让我们通过内核调试器的视角,深入分析ACPI!device后ACPI!Name函数建立子节点对象的具体过程。
1.1 ACPI命名空间基础结构
ACPI命名空间采用树形结构组织系统硬件资源,每个节点由_NSObj结构体表示。从调试信息中我们可以看到典型的结构定义:
c复制ACPI!_NSObj
+0x000 list : _List // 链表指针
+0x008 pnsParent : _NSObj* // 父节点指针
+0x00c pnsFirstChild : _NSObj* // 首个子节点
+0x010 dwNameSeg : ULONG // 4字符名称标识
+0x014 hOwner : PVOID // 所有者句柄
+0x018 pnsOwnedNext : _NSObj* // 所属链表下一个节点
+0x01c ObjData : _ObjData // 对象数据
+0x030 Context : PVOID // 上下文指针
+0x034 dwRefCount : ULONG // 引用计数
在给出的示例中,我们观察到以下命名空间层级:
code复制PCI0 (0x899affac)
└── AGP_ (0x899b21bc)
└── _ADR (0x899b2234)
1.2 设备创建操作码解析
调试器显示的操作码序列揭示了ACPI字节码的解析过程:
code复制f74c8cbb 5b 82 46 58 49 53 41 5f 08 5f 41 44 52 0c 00 00 [.FXISA_._ADR...
关键操作码解析:
0x5b:扩展操作码前缀0x82:设备创建操作(DeviceOp)"FXISA_":6字符设备名称0x08:NameOp前缀"_ADR":地址对象名称0x0c:DWordPrefix0x00000007:设备地址值
注意:ACPI名称遵循严格的4
