linux mmu原理

mmu全称:memory mangerment  unit

MMU产生的原因:

为了解决 20M程序能在4M内存上跑起来

结果:

             虚拟地址

CPU------------------MMU--------------------------物理地址

就是CPU访问内存时 给出的是一个虚拟的地址经过转换后变成实际的物理地址

过程:

要实现以上的转换 需要一个页表,这个页表 是虚拟地址与物理地址转换的表

页表中包含页表项存储在内存中一个页表项负责记录一段虚拟地址到物理地址的映射关系

在ARM中,一个页可以被配置成1K、4K、64K或1M大小(ARM v6体系以后,不再支持1K大小的页),分别叫做微页、小页、大页和段页。页的大小决定了映射的粒度,是根据实际应用有选择地配置的。以1M为例,按照我们前面的描述,假设系统中将有64M内存需要被映射,那么我们一共需要64M/1M个页表项,而每个页表项需要占据4个字节,也就是说,有256字节的内存要专门负责地址映射,不能用于其他用途。

       对于1K、4K和64K大小的页,MMU采用二级查表的方法,即首先由虚拟地址索引出第一张表的某一段内容,然后再根据这段内容搜索第二张表,最后才能确定物理地址。这里的第一张表,我们叫它一级页表,第二张表被称为是二级页表采用二级查表法的主要目的是减小页表自身占据的内存空间,但缺点是进一步降低了内存的寻址效率。不同大小的页对查表方法的支持程度如表3-1所示。

表3-1  不同大小页的查表方法

 

页大小

查表方法

1K

4K

64K

1M

一级查表

不支持

不支持

不支持

支持

二级查表

支持

支持

支持

不支持


  一级查表只支持大小为1M的页。准确地讲,这里所谓的1M大小的页,应称为段(section)。此时,一级页表也被称为段页表。图3-4描述了段页表的内存分布情况和段页表项的具体格式。


                                                            图3-4  段页表项的结构

如何操作:

假设页表的首地址是(这个首地址程序员自己知道)0x01000000 假设虚拟地址是 0x00101000 取出前12位左移两位然后与基地址相与即是页表项地址,页表项中存储的就是福

那么页表项地址就应该是0x10000000|0x004=0x10000004,从该地址中读取的32位的数据即是该虚拟地址所对应的页表项。

例如,从0x10000004中读出的页表项的内容为0x30000c12

那么可以判定 物理地址范围是 0x30000000与0x30100000之间

将页表项的内容清除掉后20位的结果为0x30000000,虚拟地址的后20位为0x01000,将其和0x30000000相与,结果为0x30001000,这便是最终的物理地址

也就是将页表项的 内容清楚的后二十位 与 虚拟地址的后20位进行与的操作得到的就是 物理地址了

mmu 转换公式:

1、根据页表首地址与虚拟地址计算出 页表项的偏移地址 (虚拟地址 取出前12位然后左移两位与首地址相与 获得页表项的值)

2、页表项的值清除掉后20位 与 虚拟地址的后20位相与











  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值