1. ACPI Store函数核心机制解析
在ACPI(高级配置与电源管理接口)的实现中,Store操作是最基础也是最关键的数据传输指令之一。它负责将源操作数的值存储到目标操作数中,相当于编程语言中的赋值操作。通过分析Windows内核调试器(WinDbg)的输出,我们可以清晰地看到Store指令执行时的内存结构和参数传递机制。
1.1 Store指令的AML表示与参数传递
在ACPI机器语言(AML)中,Store指令的标准格式为:
aml复制Store (Source, Destination)
当AML解释器遇到Store操作码时,会创建对应的_term结构体,其中关键字段pdataArgs数组保存了两个参数:
- pterm->pdataArgs[0]:对应Source(源操作数)
- pterm->pdataArgs[1]:对应Destination(目标操作数)
调试输出显示:
code复制1: kd> dx -r1 ((ACPI!_term *)0x8997ddb0)
[+0x024] iArg : 2
[+0x028] icArgs : 2
[+0x02c] pdataArgs : 0x8997c158
这证实了Store操作确实需要两个参数,且参数通过_ObjData结构体数组传递。
1.2 _ObjData结构的内存布局
每个参数都是一个_ObjData结构,占用0x14字节空间。关键字段包括:
c复制typedef struct _ObjData {
USHORT dwfData; // 数据标志位
USHORT dwDataType; // 数据类型标识
union {
ULONG dwRefCount; // 引用计数
_ObjData* pdataBase; // 基础对象指针
};
union {
ULONG dwDataValue; // 整数值
ULONG uipDataValue; // 无符号整数值
_NSObj* pnsAlias; // 命名空间别名
_ObjData* pdataAlias;// 数据别名
