当 Linux 内核启动时,它会从系统固件中检索 ACPI 表。系统启动后,我可以使用实用程序从正在运行的内核内存中检索表,例如acpidump
也许这个问题并不是真正的 Linux 特定的,因为其他操作系统必须遵循一些类似的程序,但我仍然对 Linux 内核最初如何从系统固件中检索它们感兴趣。我查看了一些内核源代码,但无法直接回答它是如何工作的。
当 Linux 内核启动时,它会从系统固件中检索 ACPI 表。系统启动后,我可以使用实用程序从正在运行的内核内存中检索表,例如acpidump
也许这个问题并不是真正的 Linux 特定的,因为其他操作系统必须遵循一些类似的程序,但我仍然对 Linux 内核最初如何从系统固件中检索它们感兴趣。我查看了一些内核源代码,但无法直接回答它是如何工作的。
请参阅: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(“隐藏”):访问非易失性固件存储通常相当复杂且速度不是很快。