当 Linux 内核启动时,它会从系统固件中检索 ACPI 表。系统启动后,我可以使用以下实用程序从正在运行的内核内存中检索表acpidump
也许这个问题并不是 Linux 特有的,因为其他操作系统必须遵循一些类似的过程,但我仍然对 Linux 内核最初如何从系统固件中检索它们感兴趣。我查看了一些内核源代码,但无法得到其工作原理的直接答案。
答案1
请参见:http://wiki.osdev.org/RSDP
检索 ACPI 表的第一步是查找根系统描述指针 (RSDP)。
在 UEFI 系统上,它可以在 EFI_SYSTEM_TABLE 中方便地给出。
在传统的BIOS系统上,需要搜索两个内存区域。首先,在16位实模式地址0x40E中,将有一个2字节的段指针,指示扩展BIOS数据区(EBDA)所在的位置。 RSDP 可以位于 EBDA 的前 1 KiB 内,由字符串“RSD PTR”标识,保证位于 16 字节边界上。
另一个可能的区域是低于 1 MiB 的主 BIOS 区域,或者实模式地址 0x000E0000 到 0x000FFFFF。
与所有固件(闪存 EEP)ROM 内容一样,出于性能原因,这些内容已由固件本身复制到 RAM(“影子”):对非易失性固件存储的访问通常相当复杂且速度不是很快。