1. 分页机制
可以参考: Architecture/x86/IA32和x64架构分页数据结构
系统运行在stage2阶段使用PAE分页模式, 运行在stage3阶段使用IA-32e分页模式.
PAE分页模式的页表结构很大程度参考了Windows NT的设计.
而IA-32e分页模式在映射时PDT与PT表采用了动态分配的策略.
1.1. PAE分页模式实现
2 + 9 + 9 + 12
PAE分页模式下存在PDPT、PDT和PT三级页表结构, 在 inc/page.inc文件中定义了PAE分页模式下的三个页表结构地址值:
-
PT_BASE与PT_TOP, 值分别为C0000000H与C07FFFFFH, 这个PT区域共8MB, 是整个PAE分页模式下的页表结构区域, 这里是虚拟地址区域. -
PT_PHYSICAL_BASE与PT_PHYSICAL_TOP, 值分别为200000H与9FFFFFH, 定义PT区域的物理地址. -
PDT_BASE与PDT_TOP, 值分别为C0600000H与C0603FFFH, 共16KB. PDT区域内嵌在PT区域内, 这里是虚拟地址区域. -
PDT_PHYSICAL_BASE与PDT_PHYSICAL_TOP, 值分别为800000H与803FFFH, 定义PDT区域的物理地址.
在Windows NT设计中, PDPT_BASE 与 PDPT_TOP 值分别为 C0603000H 与 C060301FH, 也嵌在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.
整个PT区域的物理地址区域是从 200000H 到 9FFFFFH(共8MB), 对应虚拟地址 C0000000H 到 C07FFFFFFH.
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_BASE到PT_TOP区域(C0000000H到C07FFFFFH)的映射关系.
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_BASE64与PPT_TOP64, 值分别为FFFFF6FB_7DA00000H与FFFFF6FB_7DBFFFFFFH, 定义PDPT区域, 共2MB大小, 这是虚拟地址. -
PPT_PHYSICAL_BASE64与PPT_PHYSICAL_TOP64, 值分别为2000000H与21FFFFFH, 定义PDPT区域的物理地址. -
PXT_BASE64与PXT_TOP64, 值分别是FFFFF6FB_7DBED000H与FFFFF6FB_7DBEDFFFH, 定义PML4T区域, 共4KB大小, 这是虚拟地址. -
PXT_PHYSICAL_BASE64与PXT_PHYSICAL_TOP64, 值分别为21ED000H与21EDFFFH, 定义PML4T区域物理地址.
注: 这个2MB和4KB, 可参照Architecture/x86/IA32和x64架构分页数据结构 4.1 4Kb页面线性地址翻译
PDT与PT在PT pool(或备用PT pool, 参见表1-6)里分配, 如图1-8.
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给一组处理器共同执行某个程序.