如何使用 ACPI 编译、运行 AML,或者应如何使用 ACPI 函数?



我正在尝试编写一个内核并计划在某些问题上使用 ACPI(例如,在 APIC 上识别中断源(。

但是,我真的是这方面的初学者,我阅读了相关文档,但仍然不知道如何配置和使用 ACPI 函数。

我有一些基本的了解:

1、有一些ACPI表会映射到内存空间中,其中DSDT和SSDT会提供一些定义块。

2、定义块为反洗钱代码

3、我可以直接从ACPI表中检索一些信息(例如I/O APIC基址(

4、更多信息有时需要运行ACPI对象。

这些基本上是我对ACPI的理解。但是,我应该如何使用 AML 代码,我应该如何运行 ACPI 对象。我一点头绪都没有。

那么,如果有人可以提供这种机制如何工作的基本结构,那么操作系统如何实现ACPI提供的一些基本功能?

多谢!我会继续阅读文档,并尝试找到一些可以帮助我理解它的东西。

我的建议是:

a( 如果您是初学者,请实现对"PIC 芯片"的支持,同时考虑未来对 IO APIC 和 MSI 等内容的支持,但尚未实现该支持(例如,只是虚拟存根等(;然后担心以后添加对 IO APIC(和 MSI(和 ACPI 的支持(例如,在完成大部分操作系统(包括设备驱动程序、文件系统等(之后(。请注意,这是我提倡"内核告诉设备驱动程序它应该使用哪些资源"方法(而不是"设备驱动程序告诉内核它需要哪些资源"方法(的重要原因 - 因此您可以稍后添加对 IO APIC 和 MSI 的支持,而无需接触任何设备驱动程序的任何代码。

b( ACPI的反洗钱;这是一个令人讨厌的溃烂。具体来说,操作系统必须告诉 AML 操作系统是什么(例如,在 AML 中使用_OS对象告诉 AML 操作系统的名称(,如果操作系统未被计算机的 AML 识别,那么 AML 通常会回退到残缺的"基本功能"模式,并且许多计算机的 AML 将仅识别(各种版本的(Windows。结果是,要使用 AML 提供的全部功能,您的操作系统必须假装它是 Windows(一个版本(,并且必须具有与该版本的 Windows 相同的行为,这没有很好的文档记录(例如,根本不包含在 ACPI 规范中(,并且不容易通过"试错"技术发现。如果这还不够糟糕;各种计算机都有错误的 AML,您需要针对这些错误的"谁知道有多少"解决方法。解决此问题的最实用方法是依靠其他人编写的经过良好测试的代码。更具体地说;您可能希望移植 ACPICA(请参阅 https://acpica.org/(,这是一个开源且独立于操作系统的 ACPI 实现,其中包括一个 AML 解释器并隐藏/抽象了很多痛苦。

如果您正在使用 linux,请尝试以下操作(以 root 身份(,它会给你一个良好的开端(您应该安装与发行版相关的软件包,如 acpica-tools(:

$acpidump > dump.bin
$acpixtract -x dump.bin

(这将为初始转储文件中的每个表创建一个二进制文件.dat。

$iasl -d *dat

(这会将二进制文件反汇编为人类可读的格式(

您也可以从 GitHub 下载英特尔对 IASL 编译器的实现(查找一下,编译起来非常容易(

相关内容

最新更新