news 2026/5/1 0:27:34

ACPI中的HID(硬件ID)和PCI配置空间中的设备标识符的关系ACPI!ACPIBuildProcessDevicePhaseAdrOrHid函数分析有要么有HID或要么有ADR

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACPI中的HID(硬件ID)和PCI配置空间中的设备标识符的关系ACPI!ACPIBuildProcessDevicePhaseAdrOrHid函数分析有要么有HID或要么有ADR

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:47:06

高频面试题:Java死锁问题如何解决?

大家好&#xff0c;我是锋哥。今天分享关于【高频面试题&#xff1a;Java死锁问题如何解决?】面试题。希望对大家有帮助&#xff1b;高频面试题&#xff1a;Java死锁问题如何解决?死锁产生的四个必要条件&#xff08;缺一不可&#xff09;互斥&#xff08;Mutual Exclusion&a…

作者头像 李华
网站建设 2026/5/1 6:54:57

ThreadLocal 实现线程隔离的数据传递

在 Java Web 项目开发中&#xff0c;我们经常会遇到一个问题&#xff1a;一次 HTTP 请求的处理流程会跨越 Controller、Service、Mapper 等多个层级&#xff0c;若需要在这些层级间传递通用数据&#xff08;比如当前登录用户 ID&#xff09;&#xff0c;层层显式传参不仅代码繁…

作者头像 李华
网站建设 2026/5/1 5:44:07

基于 AOP + 反射实现公共字段自动填充

在 Java 项目的数据库操作中&#xff0c;我们总会遇到这样的重复场景&#xff1a;新增数据时要手动设置createTime、createUser、updateTime、updateUser&#xff0c;修改数据时又要重复设置updateTime、updateUser。这些机械的代码遍布各个 Service 层&#xff0c;不仅让代码臃…

作者头像 李华
网站建设 2026/4/26 18:47:16

57 Redis Lua脚本应用

Redis Lua脚本应用 本文深入剖析Redis Lua脚本的核心应用场景,详解EVAL命令执行、原子性操作保证、限流脚本实现、分布式锁脚本以及脚本缓存机制,掌握高性能Redis编程技巧。 1 为什么需要Lua脚本? 1.1 传统Redis操作的痛点 在企业级开发中,我们经常遇到需要执行多个Redis命令…

作者头像 李华
网站建设 2026/4/30 21:47:29

用给女朋友点奶茶解释AI算法:原来机器学习这么简单!

当你学会用点奶茶解释AI&#xff0c;就会发现技术从未如此美味 开篇&#xff1a;那个改变一切的下午 上周六下午3点&#xff0c;我犯了一个直男典型错误——给正在生理期的女友点了全冰杨枝甘露。后果很严重&#xff1a;她眉头紧锁&#xff0c;我跪了半小时键盘。 但正是这次…

作者头像 李华