1. ACPI设备检测机制概述
在计算机系统中,ACPI(高级配置与电源管理接口)负责硬件设备的电源管理和配置工作。其中ACPI驱动程序的ACPI!ACPIDetectPdoDevices函数扮演着关键角色,它通过扫描ACPI命名空间来识别和枚举各种设备。这个函数在系统启动过程中会被多次调用,特别是在处理电源状态转换时。
Device (ACAD)是一种特殊的ACPI设备对象,通常与交流电源适配器(AC Adapter)相关。当笔记本电脑连接或断开电源时,系统需要通过这个设备对象来感知电源状态变化。ACPI规范中定义了_PSR、_PCL等控制方法,用于查询和设置ACAD设备的状态。
注意:不同厂商的ACPI实现可能存在差异,特别是在_DSM(设备特定方法)的使用上,这会导致ACPI!ACPIDetectPdoDevices函数的行为有所不同。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. ACPIDetectPdoDevices函数工作原理
2.1 函数调用流程分析
当ACPI驱动程序初始化时,会创建一个功能设备对象(FDO),然后通过ACPI!ACPIDetectPdoDevices函数枚举其下的物理设备对象(PDO)。对于每个检测到的设备,函数会:
- 解析ACPI命名空间中的设备对象
- 检查_HID(硬件ID)和_CID(兼容ID)等标识符
- 为有效设备创建对应的PDO
- 初始化设备状态和电源管理能力
对于Device (ACAD),函数会特别检查以下控制方法:
- _PSR(Power Source):返回当前电源状态(0表示电池,1表示交流电源)
- _PCL(Power Consumer List):列出依赖此电源的设备列表
- _PSW(Power Switch):控制电源开关状态的方法
2.2 ACAD设备的特殊处理
当检测到Device (ACAD)时,ACPI!ACPIDetectPdoDevices会执行以下特殊逻辑:
- 强制设置设备为"始终开启"状态(即使系统进入睡眠状态)
- 注册电源状态变更通知回调
- 初始化电池状态跟踪机制
- 设置设备能力标志位(Capabilities)中的AC适配器位
c复制// 伪代码展示ACAD设备处理逻辑
if (DeviceIsACAD(acpiDevice))
