-
Notifications
You must be signed in to change notification settings - Fork 19
内存管理模型概述
树莓派 3 搭载的 Cortex-A53 CPU 在 AArch64 模式下最大支持 40 位的寻址空间,拥有 0、1、2、3 四级页表和分别对应 0x0000 0000 0000 0000 起始的低地址空间和 0xFFFF FF00 0000 0000 起始的高地址空间的 TTBR0 和 TTBR1 两个页表基地址寄存器,并且支持 4KB 和 64KB 两种分页大小。在我们的系统中,为了和 MIPS 版的 JOS 保持一致,采用了 4KB 分页、四级页表、40 位虚地址的组合,本文将对 RPS 的内存管理模型及其实现方法进行概述。
如 启动部分汇编代码解析 中所述,树莓派启动后,kernel8.img 中的二进制代码会被加载到物理内存 0x8 0000 位置上。此时,MMU 处于关闭状态,访存指令访问的地址即为内存的物理地址。为了将内核与用户程序在内存中隔离开来,我们需要将内核加载至高地址空间(0xFFFF FF00 0008 0000),并确保用户程序无权读写内存中的内核部分。此时有一个棘手的问题,kernel8.img 显然无法被直接加载至物理地址 0xFFFF FF00 0008 0000,因为物理内存远没有这么大;那么能否通过设置页表,将虚地址 0xFFFF FF00 0008 0000 映射至 0x8 0000 后再跳转到高地址执行呢?答案也是否定的,因为访存指令中访问的地址仍是低地址的物理地址,映射后必然无法正常执行。
我们的解决方法是这样的,首先通过一段相对 0x8 0000 寻址的简短汇编和 C 语言代码,建立起高地址空间到低地址空间的线性映射;随后,跳转到相对 0xFFFF FF00 0008 0000 寻址的内核核心代码,完成初始化等工作。为了完成上述要求,我们修改了 Linker Script loader,将 boot/init.o 和 mm/mm_init.o 链接至 0x8 0000 起始的低地址,而内核的其他部分则链接至高位赋 1 的对应高地址。
解决了这个问题之后,虚拟内存的管理就简单很多了,以下是我们定义在 mm/include/mmu.h 中的内存布局:
4G -----------> +----------------------------+------------0x FFFF FF01 0000 0000
| |
| ... |
| |
TIMESTACKTOP -----> |----------------------------+------------0x FFFF FF00 0175 1000
| TIMESTACK |
|----------------------------+------------0x FFFF FF00 0175 0000
| ENVS |
|----------------------------+------------0x FFFF FF00 0170 0000
| PAGES |
|----------------------------+------------0x FFFF FF00 0140 0000
| Kernel Page Table |
KSTACKTOP -----> +----------------------------+------------0x FFFF FF00 0100 0000
| Kernel stack |
|----------------------------|
| Kernel Text |
KERNBASE -----> +----------------------------+------------0x FFFF FF00 8 0000
| reserved |
+----------------------------+------------0x FFFF FF00 0000
4G -----------> +----------------------------+------------0x 0001 0000 0000
| |
| ... |
| |
USTACKTOP -----> +----------------------------+------------0x 8000 0000
| User stack |
|----------------------------|
| User Text |
0 ------------> +----------------------------+------------0x 0000
有关页表项格式及虚拟内存结构,请参考 ARM® Architecture Reference Manual ARMv8 中的 Chapter D5。