在操作系统启动的早期阶段,直接建立完整的内存映射在技术上不可行或效率极低,而 Fixmap 提供了一种轻量级、静态预定义的映射机制,解决了这一矛盾。以下是详细分析:
- 启动早期的限制条件
在操作系统内核刚开始执行时,面临以下关键限制:
- 内存管理子系统未初始化:动态内存分配(如
kmalloc
)、页表动态扩展等功能尚未就绪。 - 计算资源有限:CPU 可能处于低权限模式(如 ARM 的 EL2/EL1),且缓存、分支预测等优化未启用。
- 时间敏感:需尽快输出日志以调试启动问题,不能等待完整页表构建。
此时若尝试构建完整页表,会面临 “鸡生蛋,蛋生鸡” 问题:页表需要内存分配,但内存分配依赖页表。
- Fixmap 的优势
Fixmap 通过以下设计规避了上述限制:
(1) 静态编译时确定
- 虚拟地址固定:Fixmap 的虚拟地址在编译时硬编码(如
0xFFFF_FF80_0000_0000
),无需动态分配。 - 页表项预填充:在初始页表中预先映射关键设备(如串口)