6. 系统机制

1. 分页机制

可以参考: Architecture/x86/IA32和x64架构分页数据结构

系统运行在stage2阶段使用PAE分页模式, 运行在stage3阶段使用IA-32e分页模式.

PAE分页模式的页表结构很大程度参考了Windows NT的设计.

IA-32e分页模式在映射时PDTPT表采用了动态分配的策略.

1.1. PAE分页模式实现

2 + 9 + 9 + 12

PAE分页模式下存在PDPTPDTPT三级页表结构, 在 inc/page.inc文件中定义了PAE分页模式下的三个页表结构地址值:

  • PT_BASEPT_TOP, 分别为 C0000000HC07FFFFFH, 这个PT区域共8MB, 是整个PAE分页模式下的页表结构区域, 这里是虚拟地址区域.
  • PT_PHYSICAL_BASEPT_PHYSICAL_TOP, 值分别为 200000H9FFFFFH, 定义PT区域的物理地址.
  • PDT_BASEPDT_TOP, 值分别为 C0600000HC0603FFFH, 共16KB. PDT区域内嵌在PT区域内, 这里是虚拟地址区域.
  • PDT_PHYSICAL_BASEPDT_PHYSICAL_TOP, 值分别为 800000H803FFFH, 定义PDT区域的物理地址.

在Windows NT设计中, PDPT_BASEPDPT_TOP 值分别为 C0603000HC060301FH, 也嵌在PDT区域内. 但我们这里, 将这个 32字节(4 x 8字节)的PDPT区域移到了SDA.Ppt区域内, 并没有使用内嵌的PDPT区域.

注: 这个8MB、16KB和32字节, 可参照Architecture/x86/IA32和x64架构分页数据结构 3.1 4Kb页面线性地址翻译

SDA.Ppt存放在4个PDPTE表项, 在初始化时分别指向4个PDT区域, 如图1-7.

6. 系统机制

整个PT区域物理地址区域是从 200000H9FFFFFH(共8MB), 对应虚拟地址 C0000000HC07FFFFFFH.

1.1.1. 初始化页表结构

pre-stage2 阶段(protected模块头部, 参见 1.5.3 节代码片段 1-41)调用init_ppt_area函数初始化PDPT区域.

init_ppt_area函数所做的工作是: 将4个PDT区域物理地址写入SDA.Ppt区域内. 形成下面4个PDPTE的设置:

PDPT[0](地址为SDA.Ppt)写入值 800000H.

PDPT[1](地址为SDA.Ppt + 8)写入值 801000H.

PDPT[2](地址为SDA.Ppt + 16)写入值 802000H.

PDPT[3](地址为SDA.Ppt + 24)写入值 803000H.

注: 这里写入的是物理地址, 一个PDPTE占用空间是8字节(所以加8), 一个PDT占用空间是4KB(2^12, 所以值每次加 1000H)

pre-stage2 阶段也调用了init_pae_page函数建立基本的页映射关系(参见1.5.3节代码片段1-42). init_pae_page函数内部调用map_pae_page_transition_table函数初始化页表结构区域, 并建立PT_BASEPT_TOP区域(C0000000HC07FFFFFH)的映射关系.

1.1.2. 实现虚拟地址映射

do_virtual_address_mapping32函数(被重定义为do_virtual_address_mapping)是虚拟地址映射到物理地址的实现函数, 在lib/page32.asm文件里实现.

在虚拟地址映射时使用页表walk方式. PDPT已经设置好, 只需从PDT开始walk到PT. 当检查到表项属于not-present时写入相应的表项处理.

1.2. IA-32e分页模式实现

在IA-32e分页模式下, PML4T与PDPT区域拥有固定区域, PDT与PT表需要从PT pool里动态分配. inc/page.inc头文件里定义了下面的值.

  • PPT_BASE64PPT_TOP64, 值分别为 FFFFF6FB_7DA00000HFFFFF6FB_7DBFFFFFFH, 定义PDPT区域, 共2MB大小, 这是虚拟地址.
  • PPT_PHYSICAL_BASE64PPT_PHYSICAL_TOP64, 值分别为 2000000H21FFFFFH, 定义PDPT区域的物理地址.
  • PXT_BASE64PXT_TOP64, 值分别是 FFFFF6FB_7DBED000HFFFFF6FB_7DBEDFFFH, 定义PML4T区域, 共4KB大小, 这是虚拟地址.
  • PXT_PHYSICAL_BASE64PXT_PHYSICAL_TOP64, 值分别为21ED000H21EDFFFH, 定义PML4T区域物理地址.

注: 这个2MB和4KB, 可参照Architecture/x86/IA32和x64架构分页数据结构 4.1 4Kb页面线性地址翻译

PDT与PT在PT pool(或备用PT pool, 参见表1-6)里分配, 如图1-8.

6. 系统机制

4K大小的PML4T区域嵌入在PDPT区域内, 其中部分PML4TE与PDPTE重叠在一起.

1.2.1. 初始化页表结构

1.2.2. 实现虚拟地址映射

2. 多处理器机制

1.5中所述的系统启动完毕后, 多处理器环境被开启, BSP处于工作状态, 而所有APs处于HLT状态, 等待BSP分派任务执行.

2.1. 调度任务

所有处理器都可以通过IPI(Inter-processor interrupt, 处理器间中断)消息形式调度目标处理器执行某个任务, 也可以广播IPI给一组处理器共同执行某个程序.

2.1.1. IPI routine

2.2. 处理器切换

3. 调试记录机制