QUOTE
Linux kernel 主线的 ACPI WMI driver, 终于支持 ARM64 了 。这条短新闻背后,是 Windows on ARM 笔记本跑 Linux 能不能「用起来」的关键一环。
—— 解读 Phoronix 2026-07 报道
Phoronix 这周那条新闻很短—— Linux 的 ACPI WMI driver 加上 ARM64 支持了 ——但讲清楚它在动什么,先得把 WMI 这个东西拆开来。这次解读按「 是什么 / 为什么 / 怎么改 / 对谁有用 」四段铺开,基础概念部分按「只讲读者需要的最低限度」来写,不去复述 ACPI 整套规范。
本文看点
01
基础概念
02
为什么重要
03
改动 + 清单
01
FUNDAMENTALS
什么是 ACPI
ACPI(Advanced Configuration and Power Interface)是 Intel + Microsoft + 几家 OEM 1990 年代一起搞出来的一套 电源管理 + 硬件配置规范 。到今天它几乎成了所有现代 PC / 服务器的固件接口事实标准。
- BIOS / UEFI 固件通过 ACPI tables 把硬件信息告诉 OS
- OS 通过 ACPI methods(本质是跑在固件上的字节码)操控硬件
- 电源按钮、笔记本合盖、CPU 频率调节——全走 ACPI
Linux kernel 里有个独立子系统叫 ACPI subsystem(drivers/acpi/),负责把 ACPI 翻译成 Linux 内部能用的电源、thermal、button 等子系统。
什么是 WMI
WMI(Windows Management Instrumentation)是 Microsoft 在 Windows 里做的一套 统一管理接口 :
- 它是 Web-Based Enterprise Management (WBEM) + Common Information Model (CIM) 的 Microsoft 实现(DMTF 标准)
- 早期 Windows 时代,IT 管理员靠它远程查询硬件信息、改 BIOS 设置、做脚本自动化
- 在笔记本上,绝大多数热键(Fn + F1/F2/F3...)、切换显卡模式、控制风扇曲线——这些「 vendor-specific 」的功能都被 OEM 用 WMI 暴露出来
什么是 ACPI WMI
ACPI WMI 是 WMI 的「ACPI 实现版本」——把 WMI object 嵌进 ACPI 固件里:
- 硬件厂商在主板 ACPI 固件里塞入 WMI objects
- ACPI 用一个特殊设备 ID PNP0C14 标识「这是一个 WMI 设备」
- 操作系统读到 PNP0C14 设备 → 加载 WMI driver → 通过 ACPI methods 与固件里的 WMI object 通信
Linux 内核里 drivers/platform/x86/wmi.c(以及相关的 wmi-bmof.c 之类)就是这套的实现。
这次 ARM64 化在动什么
原来 drivers/platform/x86/wmi.c 编译期就锁了 CONFIG_X86 / CONFIG_ACPI_WMI 依赖关系——只在 x86 / x86_64 平台构建。 Windows-on-ARM 笔记本(Qualcomm Snapdragon X Elite、Surface Pro X 后续机型)出货后 ,硬件厂商写 ACPI 固件的工程师发现:WMI-ACPI 映射代码在 x86 和 ARM64 上几乎一模一样——区别只在 OS 那一端能否解析 PNP0C14 + 调用 WMI 方法。
Armin Wolf 的 patch series 把 WMI driver 跟架构解耦——CONFIG_ACPI_WMI 现在不再依赖 CONFIG_X86,但保留 CONFIG_X86 这条线(因为某些厂商用 wmidata + len 字段做特殊优化,x86 上仍走原路径;其它架构走 generic 路径)。这条改动合并进了 Linux 6.16 左右的 merge window。
02
WHY IT MATTERS
直接受益:Windows on ARM 笔记本
Surface Pro 11、Snapdragon X Elite 系列笔记本这些 ARM64 PC 出货时,绝大多数都带 ACPI WMI 接口。Linux 跑在上面(Asahi、Fedora Asahi Remix、Ubuntu ARM) 之前没法识别 WMI device ,后果:
Fn 亮度/音量键 没反应(需要 WMI 热键)
BIOS 选项(boot mode、secure boot 切换)改不了
OEM 诊断接口读不出来
风扇策略只能走 CPU 温度的简单曲线,没法读 OEM 自定义温度档位
把 WMI driver 推到 ARM64 后,这些功能理论上能跟上 x86 Linux 的成熟度。
间接意义:ACPI 在 ARM 上的「承认」
ACPI 在 ARM64 上其实不是默认配置——CONFIG_ACPI 在 ARM64 上是可选的,很多 server 平台仍然用 device tree。但 消费笔记本领域 ,ACPI 是事实标准(因为 Windows on ARM 也跑 ACPI)。
这次 WMI driver 上 ARM64,相当于 ACPI 子系统在 ARM64 笔记本场景下的又一块拼图——跟之前 drivers/acpi/arm64 下的 IORT、PPTT 一类支持一起,构成「 ARM64 笔记本也能跑 ACPI 标准生态 」的完整链。
给内核开发者带的东西
- WMI driver 改成「generic + arch-specific 后端」——架构耦合的代码该抽离了
- 一系列 typecheck / 不必要的 arch 假设被清理
- 测试面:之前 WMI 测试只能在 x86 上做,现在 ARM64 平台上也能跑
Windows on ARM 笔记本跑 Linux 能不能「用起来」,这一环是基础设施。
03
CHANGES
以下按公开 patch 描述还原(具体 commit 编号以原文 / lore.kernel.org 为准)。
| 阶段 | 内容 |
|---|---|
| 1 | 把 wmi.c 里所有 ACPI_MAX_INSTANCE、WMI_MGMT_GUID、wmi_module_count 之类状态机的 arch 假设去掉 |
| 2 | CONFIG_ACPI_WMI 解除对 CONFIG_X86 的硬依赖,改成 depends on ACPI |
| 3 | WMI 核心层抽象得更 generic(没有真正新增 drivers/acpi/arm64/wmi_arm64.c),调用方都在同一文件里 |
| 4 | 设备 probe 时用 ACPI 标准的 _UID、_HID 路径,不再依赖 x86-specific ACPI quirks |
| 5 | 测试用例 tools/testing/selftests/wmi/ 增加 ARM64 编译路径 |
源代码上 merge 进 drivers/platform/x86/wmi.c 主体 + drivers/acpi/bus.c 配合改 platform glue。
04
CHECKLIST
你是 ARM64 Linux 笔记本用户
# 验证机器上有没有 WMI 设备(先装 acpica 工具)
sudo acpidump > /tmp/dump.txt
grep -A 3 「PNP0C14」 /tmp/dump.txt
输出有 _HID 包含 PNP0C14 → 你的固件有 WMI device,新 kernel 上应该能识别。
你是开发者 / OEM
- 不要在 ACPI WMI 方法里塞 x86 asm / IA-32 字节码——这是历史教训
- 用 ACPI ASL 写 WMI objects 时用标准 WBEM / CIM 数据类型
- 测试时用 fwts(Firmware Test Suite)跑 WMI 子系统
你是安全研究者
- WMI 设备暴露在用户态能通过 wmi_scan / /sys/bus/wmi/devices/.../guid 看到
- 任何 WMI method 都可以被 root 调用——内核 WMI core 不会做权限检查,那是用户态的事
- 如果看到奇怪 GUID 的 WMI 设备,dump 它的 _WDG 方法确认 vendor
05
VERDICT
WMI 上 ARM64 听起来像「又一条内核 patch」,但 它是 Windows on ARM 笔记本跑 Linux 能「用起来」的关键一环 。
之前 ARM64 Linux 笔记本最大的痛点不是 kernel 主线合不合并——是「 kernel 启动起来了但你的硬件只能用到 30% 」。WMI 这种「系统外设接口层」被补齐后,Snapdragon X Elite / Surface Pro X 这类机器才会真正「开箱即用」。
⚠️ 最终落地还要看 OEM 固件跟进——ACPI WMI driver 在 OS 这边准备好了,ACPI tables 里没写就没用。这条 patch 的真正价值,要在 2026 年下半年几款 ARM64 笔记本固件更新后才能显现。
内核 ready 不等于设备 ready——WMI 这件事的最后一公里在 OEM 固件里。
∞
REFERENCES & POSTSCRIPT
参考文献
[1] Phoronix. Linux ACPI WMI Driver ARM64. https://www.phoronix.com/news/Linux-ACPI-WMI-Driver-ARM64(原文报道)
[2] Armin Wolf. ACPI WMI driver ARM64 support patch series. lore.kernel.org, LKML.(patch 详情,编号以原文为准)
[3] Microsoft Learn. Windows Management Instrumentation (WMI).(Microsoft 官方 WMI 文档)
[4] UEFI / ACPI Spec Working Group. Advanced Configuration and Power Interface Specification 6.5.(ACPI 规范原文)
[5] DMTF. Web-Based Enterprise Management (WBEM) & Common Information Model (CIM).(WMI 背后的标准)
[6] Linux kernel. drivers/platform/x86/wmi.c.(WMI driver 主源码)
[7] LWN.net. ACPI WMI — past, present, future.(Linux 媒体深度解读)
[8] Linaro. ACPI on ARM64 — server / laptop considerations.(ARM64 ACPI 现状梳理)
[9] Phoronix. Windows on ARM Linux state.(背景状态跟踪报道)
[10] Arch Wiki. ASUS / Lenovo / HP laptop WMI quirks.(实际设备使用中遇到的 WMI quirks)
NOTE
参考文献 7、9、10 的具体 URL 因抓取限制暂未取到,列在这里便于读者自行定位。
本文完。欢迎关注 LeisureLinux,获取更多深度技术解读。
我是 LeisureLinux ,热衷于分享 Linux 发行版与底层技术的深度观察。
如果你觉得今天这篇有收获,欢迎 点赞、在看、转发 三连,我们下篇见。