操作系统基础杂项

本文最后更新于 2025年7月9日 晚上

操作系统基础杂项

〇、写在之前

来源为 OSDEV CN 的RSDP、APIC、ACPI等内容

一、Basic I

1.1 RSDP

Root System Description Pointer, 根系统描述指针

是ACPI编程接口中使用的数据结构

ACPI 1.0中具有以下结构:

1
2
3
4
5
6
7
struct RSDPDescriptor {
char Signature[8];
uint8_t Checksum;
char OEMID[6];
uint8_t Revision;
uint32_t RsdtAddress;
} __attribute__ ((packed));

ACPI 2.0 中为如下结构:

1
2
3
4
5
6
7
8
struct RSDPDescriptor20 {
RSDPDescriptor firstPart;

uint32_t Length;
uint64_t XsdtAddress;
uint8_t ExtendedChecksum;
uint8_t reserved[3];
} __attribute__ ((packed));
BIOS

RSDP位于EBDA(扩展BIOS数据区-Extended BIOS Data Area)的前1KB内(指向它的2字节实模式段指针位于0x40E), 或在0x000E00000x000FFFFF的内存区域(主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文件

1.3 ACPI

二、Basic II

2.1 BIOS

2.2 UEFI

2.3 MBR

2.4 GPT

三、Basic III


操作系统基础杂项
http://xjimlinx.github.io/2025/01/22/操作系统基础杂项/
作者
Xein
发布于
2025年1月22日
许可协议