ACPI中的HID(硬件ID)和PCI配置空间中的设备标识符的关系
第一部分:
ACPI!ACPIBuildProcessDevicePhaseAdrOrHid函数分析有要么有HID或要么有ADR
NTSTATUS
ACPIBuildProcessDevicePhaseAdrOrHid(
IN PACPI_BUILD_REQUEST BuildRequest
)
{
nsObject = ACPIAmliGetNamedChild(
deviceExtension->AcpiObject,
PACKED_HID
);
if (nsObject == NULL) {
//
// Otherwise, there had better be an _ADR present
//
nsObject = ACPIAmliGetNamedChild(
deviceExtension->AcpiObject,
PACKED_ADR
);
参考:
Device (AGP)
{
Name (_ADR, 0x00010000) // _ADR: Address
}
Device (ISA)
{
Name (_ADR, 0x00070000) // _ADR: Address
Device (MBRD)
{
Name (_HID, EisaId ("PNP0C02")) // _HID: Hardware ID
Name (_UID, 0x1F) // _UID: Unique ID
参考结束:
第二部分:
dsdt.dsl:1767: Device (AGP) 0x10000 "PCI\VEN_8086&DEV_7191&SUBSYS_00000000&REV_01\3&61aaa01&0&08" 1
dsdt.dsl:1772: Device (ISA) 0x70000 "PCI\VEN_8086&DEV_7110&SUBSYS_00000000&REV_08\3&61aaa01&0&38"
dsdt.dsl:2272: Device (PWR) 0x00070003
dsdt.dsl:2284: Device (USB) 0x00070002
dsdt.dsl:2294: Device (IDE) 0x00070001 "PCI\VEN_8086&DEV_7111&SUBSYS_197615AD&REV_01\3&61aaa01&0&39"
dsdt.dsl:5026: Device (EXPL) "ACPI\PNP0C02\4"
dsdt.dsl:5099: Device (DMAR) "ACPI\PNP0C02"
dsdt.dsl:5134: Device (VMGC) "ACPI\VMW0001"
p2p0 110000 "PCI\VEN_15AD&DEV_0790&SUBSYS_00000000&REV_02\3&61aaa01&0&88" 2
p2p1 120000
p2p2 130000
p2p3 140000
Device (PE40) 150000 "PCI\VEN_15AD&DEV_07A0&SUBSYS_00000000&REV_01\3&61aaa01&0&A8" 3
Device (PE50) 160000 "PCI\VEN_15AD&DEV_07A0&SUBSYS_00000000&REV_01\3&61aaa01&0&B0" b
Device (PE60) 170000 "PCI\VEN_15AD&DEV_07A0&SUBSYS_00000000&REV_01\3&61aaa01&0&B8" 13
Device (PE70) 180000 "PCI\VEN_15AD&DEV_07A0&SUBSYS_00000000&REV_01\3&61aaa01&0&C0" 1b
第三部分:
ACPI HID(硬件ID)和PCI配置空间中的设备标识符是不同但相关的概念,它们服务于不同的目的,但共同用于设备识别和驱动程序匹配。
ACPI HID(硬件ID):是ACPI(高级配置与电源接口)命名空间中用于标识设备的字符串,由固件(如BIOS/UEFI)定义。
它遵循ABC[D]xxxx格式,其中ABC[D]是供应商ID,xxxx是设备ID。对于PCI主桥,其ACPI HID通常是PNP0A03或PNP0A08,这告诉操作系统这是一个PCI根总线控制器。
ACPI HID用于操作系统在ACPI命名空间中枚举设备并加载相应的驱动程序。
PCI配置空间中的设备标识符:是PCI本地总线规范定义的硬件寄存器,位于每个PCI设备的配置空间头部。
它主要包括Vendor ID(供应商ID)和Device ID(设备ID),这两个16位的值共同唯一标识一个PCI设备的型号和制造商。这些信息是PCI设备固有的,由硬件厂商在设计芯片时写入。
关键区别与联系:
层级不同:ACPI HID是平台固件层面的抽象标识,用于操作系统发现和管理硬件资源;
PCI Vendor ID/Device ID是总线协议层面的物理标识,用于PCI子系统内部识别设备。
用途不同:ACPI HID(如PNP0A03)让操作系统知道“这是一个PCI根桥”,从而为其分配资源并枚举其下的PCI总线;
PCI Vendor ID/Device ID则让操作系统知道“这个PCI设备是一个Intel 82574L网卡”或“一个NVIDIA GeForce显卡”,从而加载具体的设备驱动程序。
关联性:一个PCI设备(如网卡、显卡)会同时拥有PCI配置空间中的Vendor ID/Device ID,
以及一个ACPI HID(通常是PNP0A03或PNP0A08,如果它是根桥;对于普通PCI设备,其ACPI标识可能通过其他方式如_CID或设备树关联)。操作系统会先通过ACPI HID发现PCI根桥,然后通过扫描PCI总线读取
各个设备的Vendor ID/Device ID来识别它们。
简而言之,ACPI HID告诉你“设备在系统中的角色”(如PCI根桥),而PCI配置空间的Vendor ID/Device ID告诉你“设备的具体型号”。
它们是操作系统在不同层级识别硬件的两个关键信息。
第二部分:
1: kd> x ACPI!ACPIBuild*dispatch
f74380d4 ACPI!AcpiBuildPowerResourceDispatch = <function> *[5]
f7438104 ACPI!AcpiBuildThermalZoneDispatch = <function> *[4]
f74380e8 ACPI!AcpiBuildRunMethodDispatch = <function> *[7]
f7438008 ACPI!AcpiBuildDeviceDispatch = <function> *[23]
f74380c4 ACPI!AcpiBuildOperationRegionDispatch = <function> *[4]
1: kd> dx -r1 (*((ACPI!long (*(*)[23])(_ACPI_BUILD_REQUEST *))0xf7438008))
(*((ACPI!long (*(*)[23])(_ACPI_BUILD_REQUEST *))0xf7438008)) [Type: long (* [23])(_ACPI_BUILD_REQUEST *)]
[0] : 0xf73fb840 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[1] : 0x0 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[2] : 0xf73fce98 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[3] : 0xf73fb118 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[4] : 0xf73fb09e [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[5] : 0xf73fb40c [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[6] : 0xf73fb7a0 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[7] : 0xf73fb246 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[8] : 0xf73fb72e [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[9] : 0xf73fafda [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[10] : 0xf73fddf2 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[11] : 0xf73fafda [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[12] : 0xf73fd18a [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[13] : 0xf73fafda [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[14] : 0xf73fcf04 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[15] : 0xf73fafda [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[16] : 0xf73fcfca [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[17] : 0xf73fafda [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[18] : 0xf73fd09e [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[19] : 0xf73fafda [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[20] : 0xf73fb36a [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[21] : 0xf73faf0a [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[22] : 0xf73fb57c [Type: long (*)(_ACPI_BUILD_REQUEST *)]
1: kd> dds 0xf7438008
f7438008 f73fb840 ACPI!ACPIBuildProcessGenericComplete [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 4654]
f743800c 00000000
f7438010 f73fce98 ACPI!ACPIBuildProcessDeviceFailure [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 2507]
f7438014 f73fb118 ACPI!ACPIBuildProcessDevicePhaseAdrOrHid [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 2844]
f7438018 f73fb09e ACPI!ACPIBuildProcessDevicePhaseAdr [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 2754]
f743801c f73fb40c ACPI!ACPIBuildProcessDevicePhaseHid [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 3434]
f7438020 f73fb7a0 ACPI!ACPIBuildProcessDevicePhaseUid [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 4547]
f7438024 f73fb246 ACPI!ACPIBuildProcessDevicePhaseCid [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 3018]
f7438028 f73fb72e ACPI!ACPIBuildProcessDevicePhaseSta [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 4479]
f743802c f73fafda ACPI!ACPIBuildProcessDeviceGenericEvalStrict [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 2657]
f7438030 f73fddf2 ACPI!ACPIBuildProcessDevicePhaseEjd [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 3247]
f7438034 f73fafda ACPI!ACPIBuildProcessDeviceGenericEvalStrict [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 2657]
f7438038 f73fd18a ACPI!ACPIBuildProcessDevicePhasePrw [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 3935]
f743803c f73fafda ACPI!ACPIBuildProcessDeviceGenericEvalStrict [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 2657]
f7438040 f73fcf04 ACPI!ACPIBuildProcessDevicePhasePr0 [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 3572]
f7438044 f73fafda ACPI!ACPIBuildProcessDeviceGenericEvalStrict [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 2657]
f7438048 f73fcfca ACPI!ACPIBuildProcessDevicePhasePr1 [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 3684]
f743804c f73fafda ACPI!ACPIBuildProcessDeviceGenericEvalStrict [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 2657]
f7438050 f73fd09e ACPI!ACPIBuildProcessDevicePhasePr2 [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 3803]
f7438054 f73fafda ACPI!ACPIBuildProcessDeviceGenericEvalStrict [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 2657]
f7438058 f73fb36a ACPI!ACPIBuildProcessDevicePhaseCrs [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 3147]
f743805c f73faf0a ACPI!ACPIBuildProcessDeviceGenericEval [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 2562]
f7438060 f73fb57c ACPI!ACPIBuildProcessDevicePhasePsc [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 4228]
f7438064 00000000
f7438068 00000000
f743806c 00000000