SystemIO 冲突不是固件 bug:ACPI 操作区域与原生驱动的竞速
来源: codon.org.uk — 2026-09-09
概述
Matthew Garrett 解释了常见的 ACPI 报错 SystemIO range ... conflicts with OpRegion ... 为何通常不是固件 bug。ACPI 与设备树不同,它把硬件知识以代码(ASL 编译成字节码)的形式分发,由操作系统在运行时解释执行。设备常用索引寄存器加数据寄存器的间接寻址方式访问内部寄存器,ACPI 方法之间靠互斥锁避免竞态;但如果有人为同一硬件写了直接访问寄存器的 Linux 驱动,它完全不知道 ACPI 的存在,就可能与固件方法抢用同一个索引寄存器——历史上真出现过把状态标志当温度读、从而触发立即热关机的事故。内核因此阻止这类驱动加载并打印警告,正确做法是使用该设备的 ACPI 驱动。
核心要点
- ACPI 把硬件知识以代码而非数据的形式分发,由操作系统在运行时解释 ASL 字节码。
- 设备常用索引寄存器加数据寄存器的间接寻址,ACPI 方法之间用 Mutex 串行化访问。
- 内核发现驱动申请的 IO 端口已被 ACPI 操作区域占用时阻止驱动加载并打印警告,这是保护而非报错。
- 历史上真出过事:固件与 Linux 同时访问温度芯片,可能读到状态标志而不是温度,导致立即热关机。
- 正确做法是使用该设备的 ACPI 驱动,而不是绕过 ACPI 直接访问硬件寄存器的原生驱动。
金句
内核无法知道固件在那个区域会做什么样的访问,所以它假定这可能是危险的,并阻止驱动加载。
👍 0
👎 0
返回 Lobsters 首页