
开源开发者 Armin Wolf 最近一直在致力于在 Linux 内核中为 Windows Management Instrumentation (WMI) 平台代码添加 marshalling 支持。这项 WMI marshalling 支持旨在更好地匹配 Microsoft Windows 的 WMI ACPI 驱动的行为,并最终实现与某些 ACPI 固件更好的兼容性,同时增强一些 WMI 驱动。
WMI marshalling 支持是此次努力的第二个 RFC 修订版本,旨在更好地匹配 Windows 的 WMI ACPI 驱动的处理方式。Wolf 在本周末的 v2 补丁系列中解释了他的工作:
Windows WMI-ACPI 驱动程序可能使用 wmilib 与用户空间中的 WMI 服务进行交互。该库使用普通的字节缓冲区来交换数据,因此 WMI-ACPI 驱动程序必须在这些字节缓冲区与 ACPI 固件返回的 ACPI 对象之间进行转换。
字节缓冲区的格式已公开文档,经过对 WMI-ACPI 驱动程序的一些逆向[工程]分析,使用一组自定义的 ACPI 表后,发现了以下转换规则:
– ACPI 整数始终转换为 uint32
– ACPI 字符串转换为特殊的 WMI 字符串
– ACPI 缓冲区按原样复制
– ACPI 包被解包将 ACPI-WMI 扩展以执行此类 WMI 数据块、方法和事件的打包操作,将为我们带来诸多好处:
– WMI 驱动不再局限于一组固定的受支持 ACPI 数据类型,参见 dell-wmi-aio(整数与缓冲区)和 hp-wmi-sensors(字符串与缓冲区)
– 正确地对 WMI 字符串进行封包,当数据块被标记为需要 ACPI 字符串而非 ACPI 缓冲区时
– 在无需理解 ACPI 的情况下开发 WMI 驱动程序 这最终应该能提高与某些 ACPI 固件实现的兼容性,并使 WMI 驱动程序更简单。
第一个补丁扩展了 WMI 驱动核心,以执行所述的封包操作,并引入了一个不基于 ACPI 对象的新 API。下一个补丁则添加了一个 KUnit 测试用于测试封包代码。接下来的两个补丁则添加了一组辅助函数以处理与 WMI 字符串数据一起,还有一个 KUnit 测试。
其余补丁则将一些简单的 WMI 驱动程序转换为使用新的 WMI API,并更新驱动开发指南,使新的 WMI 驱动程序不再使用基于 ACPI 的 API。
该系列补丁已在多台机器上进行了测试,其中 xiaomi-wmi 和 intel-wmi-sbl-fw-update 驱动程序使用一组自定义的 ACPI 表进行测试,这些表是通过 configFS 加载的。
通过更好地模拟 Microsoft Windows 的行为,最终将有助于 WMI 驱动程序更好地支持 Linux 上的新型硬件,特别是笔记本电脑。该代码仍在内核邮件列表上进行审查和测试。
转自 WMI Marshalling Support For Linux Aims To Match Windows’ ACPI/WMI Handling – Phoronix
Linuxeden开源社区