操作系统基础杂项
本文最后更新于 2025年7月9日 晚上
操作系统基础杂项
〇、写在之前
来源为 OSDEV CN 的RSDP、APIC、ACPI等内容
一、Basic I
1.1 RSDP
即 Root System Description Pointer, 根系统描述指针
是ACPI编程接口中使用的数据结构
ACPI 1.0中具有以下结构:
1 | |
ACPI 2.0 中为如下结构:
1 | |
BIOS
RSDP位于EBDA(扩展BIOS数据区-Extended BIOS Data Area)的前1KB内(指向它的2字节实模式段指针位于0x40E), 或在0x000E0000到0x000FFFFF的内存区域(主BIOS区域低于1 MB)中。 要查找表,操作系统必须在两个区域之一中找到 “RSD PTR” 字符串 (注意最后一个空格字符)。 此签名始终位于16字节边界上。
UEFI
如果您使用的是UEFI,您可以在EFI_SYSTEM_TABLE中的某个地方找到它。 因此,没有必要搜索内存。
查找RSDP的标准方法在UEFI系统上可能不起作用。 因此,在EFI_SYSTEM_TABLE中找到它是正确且可靠的方法 (请参阅ACPI 6.2 5.2.5.2节 “在启用UEFI的系统上查找RSDP”)。
当使用符合multiboot2的加载程序引导时,RSDP的副本分别包含在ACPI new RSDP或ACPI old RSDP标记中。
校验和验证
在依赖RSDP之前,您应该检查校验和是否有效。 对于 ACPI 1.0 (第一个结构),将结构中的每个字节相加,并确保结果的最低字节等于零。 对于ACPI 2.0及以后,您将对第二个结构的原始 (ACPI 1.0) 部分执行完全相同的操作,然后对属于ACPI 2.0扩展的部分的字段再次执行此操作。
字段解释
1.0 开始包含的
签名(Signature):此8字节字符串(非NULL终止!)必须包含“
RSD PTR”。 位于16字节边界上校验和(Checksum):要添加到所有其他字节的值,以计算表的校验和。如果该值加在所有其他值上并强制转换为字节不等于0,则必须忽略该表。
OEMID:OEM提供的标识OEM的字符串修订版(Revision):ACPI的修订。较大的修订编号向后兼容较低的修订编号。
Rsdt地址:RSDT表的32位物理地址。
2.0 开始有的
- 长度(Length):从偏移0到末尾的整个表的大小
Xsdt地址:XSDT表的64位物理地址。如果检测到ACPI 2.0版本,即使在IA-32上,也应该使用此表而不是RSDT,将地址强制转换为uint32_t。- 扩展校验和(Extended Checksum):这个字段用来计算整个表的校验和,包含两个checksum字段
- 保留:读取时要忽略的3个字节,并且不应该被写入
1.2 APIC
即 Advanced Programmable Interrupt Controller,高级可编程中断控制器,为针对旧版PIC(8259)的最新英特尔标准。被用于多处理器系统,是所有最新的英特尔(和兼容的)处理器的组成部分。APIC用于复杂的中断重定向,以及在处理器之间发送中断。使用旧的PIC归规范无法实现这些功能。
1.2.1 检测
CPUID.01h:EDX [位9] 标志指定CPU是否具有内置的本地APIC。 通过解析MADT,可以找到系统上的所有APIC(本地APIC和IO APIC)。
1.2.2 本地APIC和IO-APIC
在基于APIC的系统中,每个CPU由 “核心(core)” 和 “本地APIC(local APIC)” 组成。 本地APIC负责处理特定于cpu的中断配置。 除此之外,它还包含“本地向量表(LVT)”,将“内部时钟”和其他“本地”中断源等事件转换为中断向量 (例如,LocalINT1管脚可以通过在LVT的相应条目中存储“2”来引发NMI异常)。
有关本地APIC的更多信息,请参见 Intel Intel系统编程指南,第3A卷第1部分 的第10章。
此外,还有一个I/O APIC(例如intel 82093AA),它是芯片组的一部分,提供多处理器中断管理,将静态和动态对称中断分布整合到所有处理器中。 在具有多个I/O子系统的系统中,每个子系统可以有自己的一组中断。
每个中断引脚都可以单独编程为边缘触发或电平触发。 每个中断都可以指定中断向量和中断控制信息。 间接寄存器访问方案优化了访问I/O APIC内部寄存器所需的存储空间。 为了在分配内存空间使用量时增加系统灵活性,I/O APIC的两个寄存器内存空间是可重定位的,但默认为0xFEC00000。
APIC的英特尔标准可在英特尔网站上的“多处理器规范”类别下找到,或者只需这个PDF文件。