Skip to content

内存管理模型概述

Kangxu Liu edited this page Jun 26, 2016 · 2 revisions

树莓派 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。

Clone this wiki locally