MMU内存管理单元(1)-基础

<MMU(Memory Management Unit)内存管理单元>

        MMU(内存管理单元)在ARM中扮演着重要的角色,其一,建立了物理内存到虚拟内存的映射;其二,保护内存不受非法访问,即访问权限管理;其三,灵活地管理cache、buffer。

 

<MMU内存映射功能>

        在MMU中,硬件上采用 地址重定位(address relocation) 的方式来实现虚拟内存到物理内存的映射。软件上采用页表机制 在管理虚拟内存段该映射至哪一段物理内存。

        例如,在拥有32位地址线的ARM中,仅有一块64M的SDRAM(映射至物理内存0x30000000~0x34000000)。

        在没有MMU的支持下,SDRAM内的代码、数据仅能由CPU访问该对应的物理地址范围内进行访问,即CPU通过访问物理地址0x30000000~0x34000000来访问SDRAM;但是,在MMU的支持下,CPU访问的是虚拟地址,通过对MMU的设置,CPU可以通过访问虚拟地址0x00000000~0xffffffff(0~4G,因CPU地址线32根)任意地址来访问SDRAM。

        如下图,CPU设置完页表,开启MMU后,访问虚拟空间0x50000000~0x54000000(该地址由页表设置)便是访问物理空间0x30000000~0x34000000。

        

        通过这样的映射方式,CPU可以将多个任务映射至同一段虚拟内存,而各个任务在物理内存上实际是分开的。这就是为什么两个不同的进程运行时,某些变量的地址相同的原因,该地址是指逻辑地址(实际上在物理上两个进程的不同变量的地址必然不同)。

        例如,有2个任务task1、task2,其中task1处于物理内存0x30005000~0x30006000(4KB),task2处于物理内存0x30006000~0x30007000(4KB),而task1与task2处在同样的虚拟内存空间0x00400000~0x00401000,当task1在运行时激活task1对应的页表,移除task2对应的页表;当task2在运行时激活task2对应的页表,移除task1对应的页表。同一时刻无法将同一虚拟内存映射到不同的物理内存,因此需要在任务调度程序中改变对页表的设置来实现task1、task2映射的切换。

 

<MMU内存映射方式>

        MMU映射依赖于页表,为了方便理解,笔者将页表分为2种,L1一级页表和L2二级页表。页表内的每一项内容称为页表项。L2页表又可以分为粗页表、细页表。

        L1页表:

                ① 可以存放段项,一个段项可以直接映射1M内存。

                ② 可以存放L2二级页表基地址,在这里我称之为间接拆分映射,其中L2二级页表总共映射的总内存为1M。

                ③ 根据ARM系统的位数,以32位系统为例,那么L1页表应当有4096项,每一项1M,总共映射4096*1M = 4G。

                *每一项都代表1M空间,无论其存储的是段项或L2页表基地址,因为一个L2页表必定映射1M空间。

        L2页表(粗页表、细页表):

                ① L2页表若是粗页表,那么L2页表有 256项,每一项代表4KB,总共映射256*4KB = 1M;

                    L2页表若是细页表,那么L2页表有1024项,每一项代表1KB,总共映射1024*1KB=1M;

                ② 可以存放大页,一个大页代表64KB的内存空间。

                ③ 可以存放小页,一个小页代表4KB的内存空间。

                ④ 若L2页表是细页表,那么可以存放微页,一个微页代表1KB的内存空间,粗页表无法存放微页。

        大致明白页表组成的概况后,接下来我们来了解CPU如何将虚拟地址转换为物理地址进行访问。

        一级页表映射(仅通过L1一级页表,直接映射整个1M段), 流程大致如下:

               

        例如,CPU访问0x12345678虚拟地址,MMU启动前,会预先设置L1页表基地址(也就是上图中的转换表基地址),此处假设L1页表基地址data base为0x30000000,假设此题0x12345678最终映射至0x05645678位置。(配合上图阅读)

        因为L1页表中每一项页表项代表1M,共4096项,且0x123456789处于0x12300000~0x12400000范围内(1M空间),因此MMU会根据0x123为索引在L1页表中寻找到第0x123(即291)项页表项,该页表项为32位,bit31-bit20存放着映射至的物理地址0x056(由题设决定),最低两位bit0、bit1代表该页表项的属性,本题最低两位为0b10(代表段项的意思,后续有解析),bit2-bit19中会有cache、buffer控制位决定是否使用cache、buffer,以及权限位决定是否有权限访问该地址。0x123项页表项中基值为0x056(bit31-bit20),基值0x05600000+偏移值0x45678=物理地址0x05645678,虚拟地址0x12345678便被映射为0x05645678。

        二级页表映射(间接映射),流程大致如下(下图为粗页表):

        

        倘若MMU根据虚拟地址的L1偏移值索引到的L1页表项的内容最低位不是0b10(段项)也不是0b00(无效页),那么MMU则会去访问L2页表,根据L1页表项保存的L2页表基地址找到L2页表,再根据L2偏移值寻找到L2页表中对应的页表项,取得其物理地址,将物理基值+页偏移值=物理地址。

 

<MMU页表>

        一个系统中,会有1个L1一级页表和小于等于4096个L2二级页表。一个L1一级页表会占用系统16KB的内存空间(4096页表项*4Byte=16KB);一个L2二级粗页表会占用系统1KB内存空间(256项*4Byte=1KB);一个L2二级细页表会占用系统4KB内存空间(1024项*4Byte=4KB)。

        *其中4Byte为每个页表项的大小,32位,4Byte,详见下图

        通过CPU设置协处理器CP15:c2:c0:0来告诉MMU其L1一级页表的基地址(知道如何设置即可)。

[cp15:c2:c0协处理寄存器]

        设置命令:mcr p15, 0, Rn, c2, c0, 0;将Rn设置为上图所示位即可,TTB为L1一级页表基地址,16KB对齐(因为L1一级页表占用16KB内存)此处设置的是物理地址。

[L1一级页表表项]

        *其中SBZ(should be zero)值应为0

L1页表项最低位0b10(段项):

        由于映射1M所需要的基地址只要31bit-20bit,所以在段项中仅有31bit-20bit是基地址,该处存放物理地址;AP为权限位保护内存;域位bit8-bit5可以分配该1M地址在哪个域,由于4位,共有16个域;bit4必须为1;bit3、bit2控制访问该内存是否使用cache、buffer写缓冲,最后两位不用解释,即描述该项为段项。

L1页表项最低位0b01(粗页表):

        此时L1页表项中的基地址不是物理地址的基地址了,而是L2二级页表的基地址,通过该地址我们可以寻找到L2粗页表的基地址。粗页表的基地址是1KB内存对齐的(bit31-bit10为基地址),这是因为一个L2粗页表有256项(上文有述),每一项32位,即4字节,256*4Byte=1KB。

L1页表项最低位0b11(细页表):

        此时L1页表项中的基地址不是物理地址的基地址了,而是L2二级页表的基地址,通过该地址我们可以寻找到L2细页表的基地址。细页表的基地址是4KB内存对齐的(bit31-bit12为基地址),这是因为一个L1细页表有1024项(上文有述),每一项32位,即4字节,1024*4Byte=4KB。

L1页表项最低位0b00(无效):

        该页表项无效。

[L2二级页表表项]

L2页表项最低位为0b01(大页):

        一个大页能够映射64KB的内存空间(bit31-bit16)。上文说过,L2页表有粗页表(每一项映射4KB)、细页表(每一项映射1KB)两类,因此,如果使用L2页表(粗页表)来填装大页的话,那么连续16个页表项填装同一个大页的内容(16*4KB=64KB),保证他们映射到同一个64KB内存空间;如果使用L2页表(细页表)来填装大页的话,那么连续64个页表项填装同一个大页的内容(64*1KB=64KB)。AP3-AP0每一个分别管理16KB内存空间的权限。CB为cache、buffer的使能位。初学时,我总认为4KB的小页存放在粗页表,1KB的微页存放在细页表。

L2页表项最低位为0b10(小页):

        一个小页可以映射4KB的内存空间(bit31-bit12),小页同样也可以存放在L2粗页表和L2细页表之中,小页存放于L2粗页表(每一表项映射4KB)时,小页的大小正好为4KB;若小页存放于L2细页表(每一项映射1KB)时,那么连续4个页表项会用来填装同一个小页(4*1KB=4KB)。AP3-AP0每一个分别管理1KB内存空间的权限。CB为cache、buffer的使能位。

L2页表项最低位为0b11(微页):

        一个微页可以映射1KB的内存空间(bit31-bit10),微页仅能存放在L2细页表中。AP位管理该1KB内存的权限,CB为cache、buffer的使能位。

L2页表项最低位为0b00(无效):

        该页表项无效,若CPU访问其所处的虚拟内存,进入预取指中止异常(取指令异常)。

 

<MMU-TLB>

        MMU中TLB(转换旁路缓冲器)的功能类似于cache,保存最近转换的页表项内容,如果命中,则不需要通过索引页表找到物理地址。如果再MMU开启后改变了页表中的内容,那么需要对TLB进行清除操作,否则可能会产生无法预计的后果(被改变的页表内容正好被保存在的TLB-cache中,改变后继续访问该虚拟地址时,会使用TLB-cache中的页表内容,导致系统跑至原页表内容指向的物理地址)。TLB的操作自查,在此不做详解。

 

 

 

 

       

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值