6. 系统机制
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给一组处理器共同执行某个程序.