1. ACPI设备检测机制概述
在计算机系统中,ACPI(高级配置与电源管理接口)负责硬件设备的电源管理和配置。其中ACPIDetectPdoDevices函数是Windows ACPI驱动栈中的关键例程,专门用于检测和处理ACPI命名空间中定义的设备对象。当系统枚举到Device (ACAD)这类特殊设备时,会触发一系列精密的处理流程。
ACAD设备通常代表交流电源适配器(AC Adapter),是电源管理子系统的重要组成部分。该设备的处理涉及硬件状态监控、电源策略制定和系统通知机制等多个技术层面。理解这个处理过程对开发电源管理驱动、调试ACPI兼容性问题具有重要意义。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. ACPIDetectPdoDevices函数工作流程
2.1 设备对象发现阶段
当ACPI驱动开始枚举设备时,会通过以下步骤定位ACAD设备:
- 解析ACPI命名空间树,查找_HID(硬件ID)为ACPI0003的设备
- 验证_ADR(地址)和_UID(唯一ID)等配套方法是否存在
- 检查_PSR(电源源)和_PCL(电源消耗列表)等电源相关对象
- 创建对应的物理设备对象(PDO)
注意:不同厂商的ACPI实现可能存在方法命名差异,实际处理时需要兼容ACPI 6.4规范定义的标准方法集。
2.2 ACAD设备特性解析
函数会通过以下ACPI控制方法获取设备特性:
c复制// 伪代码示例:ACAD设备方法调用流程
if (AcpiMethodExists(Device, "_PSR")) {
status = AcpiEvaluateObject(Device, "_PSR", NULL, &Result);
if (ACPI_SUCCESS(status)) {
// 处理电源连接状态(0=断开,1=连接)
Adapter->Connected = Result->Integer.Value;
}
}
if (AcpiMethodExists(Device, "_PCL")) {
// 获取电源消耗设备列表
status = AcpiEvaluateObject(Device, "_PCL", NULL, &Result);
...
}
