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

How can I compile, run AML with ACPI, or how should I utilize ACPI functions?

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

不过,我在这方面确实是个新手,看了相关的文档,仍然对如何配置和使用ACPI功能一无所知。

我有一些基本的了解:

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

2、定义块为反洗钱码

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

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

以上就是我对ACPI的基本理解。但是,我应该如何使用AML代码,我应该如何运行 ACPI对象。我不知道。

所以如果有人能提供这个机制如何工作的基本结构,ACPI提供的一些基本功能是如何通过OS实现的??

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

我的建议是:

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

b) 对于 ACPI 的 AML;这是一个令人讨厌的溃烂烂摊子。具体来说,OS 必须告诉 AML OS 是什么(例如,在 AML 中使用 \_OS 对象来告诉 AML 操作系统的名称),如果 OS 不是如果计算机的 AML 无法识别,则 AML 通常会退回到残缺不全的“最低限度功能”模式,并且许多计算机的 AML 只能识别(各种版本的)Windows。结果是,要使用 AML 提供的全部功能,您的 OS 必须假装它是 Windows 的(一个版本),并且必须具有与 Windows 的那个版本相同的行为],它没有很好的记录(例如,根本不包含在 ACPI 规范中)并且不容易通过“试错”技术发现。如果那还不够糟糕;各种计算机都有错误的 AML,您需要“谁知道有多少”这些错误的解决方法。解决此问题的最实用方法是依赖其他人编写的经过良好测试的代码。进一步来说;您可能想要移植 ACPICA(请参阅 https://acpica.org/ ),这是一个开源且 OS 独立的 ACPI 实现,其中包括一个 AML 解释器和 hides/abstracts 很多痛苦。

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

$acpidump > dump.bin

$acpixtract -x dump.bin

(这将为初始转储文件中的每个 table 创建一个二进制文件。很多“.dat”文件)

$iasl -d *dat

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

你也可以从github下载intel的iasl编译器实现(自己查查,很容易编译)