S3C2440 MMU详解

序言

    在曾经的很久一段时间,我对于MMU都有一种莫名的敬畏。来自于对其的认知不够透彻,因此我必须在此把MMU的原理完整的记录下来,作为对过去的一个了结。

MMU的意义

    我相信关于MMU存在的必要性的说明都已经的烂大街了。我想强调的是在现代大型操作系统对硬件的基本要求中MMU就是其中一项。在操作系统中所有进程都有自己专属的MMU页表,这些页表会在任务调度中动态切换,以避免黑客程序恶意攻击 以及 程序设计无需考虑如何分配到空闲内存的目的。

MMU的原理

    我认为MMU的设计有如下目的:

  1. 能覆盖全范围的地址寻址
  2. 基于页表进行地址索引
        以下图为例,TTB是ARM的寄存器,存放着一级页表的基地址,上面所说的任务调度中所谓切换的MMU页表,也就是切换该寄存器的值。
        首先我们看一级页表总共有4096项,而我们的mpu是32位寻址,可寻址范围是 4096 * 1M,那就代表着每一项一级页表就映射着1M寻址空间。
        在一级页表中,我们发现有段,粗页,细页,其实设计的目的无非就是把1M空间再进行细划分,其中粗页256项,其细分的大小是4K,则一个粗页表的总大小也就是1M,细页表(1024 * 1K)也是如此。
        而图中的大页(64K),小页(4K),极小页(1K),其实跟MMU没有必然关系,他们的划分更像是一种管理的策略。一项粗页才4K,硬要用粗页描述一个完整的大页,就意味着,需要16个连续的粗页指向同一个大页基地址才能实现的,仅此而已。
        曾经我一直在想一个完整的MMU页表到底要占用多少内存?
    那就让我现在来解答这个问题,以32bit寻址空间为例,4096个一级页表是肯定少不了的。假设在一级页表中有x个段页,y个粗页,z个细页来说,一个完整的MMU页表应该占用
    SIZE=(4096 + y * 256 + z1024) 4 单位:byte
    S3C2440 MMU详解