1. ACPI设备与子节点对象创建概述
在ACPI(高级配置与电源管理接口)设备驱动开发中,ACPI!device和ACPI!Name函数的配合使用是构建设备树的关键操作。这个技术点主要解决设备枚举过程中子设备的动态识别与注册问题,特别是在热插拔设备、多功能复合设备等场景下尤为重要。
我曾在开发一款多功能读卡器驱动时,就遇到过SD/MMC/TF卡槽需要动态识别的问题。传统静态设备树无法满足这种需求,而通过ACPI!Name建立子节点对象的方式,完美实现了卡槽的按需加载。这种方法的本质是通过ACPI命名空间动态扩展,让父设备能正确识别和管理子设备。
2. ACPI设备树与命名空间基础
2.1 ACPI设备树结构解析
ACPI设备树采用树状结构组织系统硬件设备,每个节点代表一个物理或逻辑设备。与静态设备树不同,ACPI设备树的特点在于:
- 动态性:支持运行时修改和扩展
- 层次性:严格的父子关系
- 命名空间:每个设备有唯一路径标识
典型的ACPI路径格式如下:
code复制\_SB.PCI0.SATA.DEV0
其中_SB是系统总线根节点,后续依次是PCI控制器、SATA控制器和具体设备。
2.2 ACPI!device的作用机制
ACPI!device是ACPI驱动框架中的核心对象,它对应着ACPI命名空间中的一个设备节点。在Windows驱动开发中,这个对象通过以下方式创建:
c复制NTSTATUS status = AcpiCreateDevice(
DriverObject,
&deviceExtension->AcpiDevice,
AcpiDeviceName
);
关键点在于:
- 它会自动解析ACPI表中对应设备的_HID/_CID等信息
- 建立与ACPI子系统的通信通道
- 为后续子设备操作提供父容器
3. ACPI!Name函数的子节点创建实战
3.1 函数原型与参数解析
ACPI!Name函数用于动态创建或修改ACPI命名空间中的对象。其典型用法如下:
c复制ACPI_STATUS AcpiEvaluateName(
ACPI_HANDLE Handle,
ACPI_STRING P
