返回列表 发帖

[站长原创] 移植内核必备知识-ARM的存储管理单元MMU知识点介绍

[站长原创] 移植内核必备知识-ARM的存储管理单元MMU知识点介绍

移植内核必备知识-ARM的存储管理单元MMU知识点介绍


嵌入式开发联盟www.mcuos.com

Osboy站长原创

QQ:82475491

Mcuos.com@gmail.com


由于ARMMMU知识体系比较庞大,网络上介绍性的培训性的文章也五花八门,这里Osboy只总结必须知道了解的MMU知识点,避免介绍性的废话耽误大家的时间。


(一)MMU内存管理单元的作用

1)虚拟存储空间到物理存储空间的映射

2)存储器访问权限控制

3)设置虚拟存储空间的缓冲特性

(二)MMU的地址变换的内存块单元

1)段单元:按大小为1M的内存块单元为单位进行的虚拟地址物理地址之间的变换。

2)大页单元:按大小为64K的内存块单元为单位进行的虚拟地址物理地址之间的变换。

3)小页单元:按大小为4K的内存块单元为单位进行的虚拟地址物理地址之间的变换。

4)极小页单元:按大小为1K的内存块单元为单位进行的虚拟地址物理地址之间的变换。

Linux在最初的汇编代码中使用段单元的映射机制来实现MMU的开启。当Linux系统启动之后采用的是小页单元的映射机制,因为我们知道Linux把物理内存和虚拟内存的管理是按页来管理的,每个页大小为4k字节。

(三)MMU的地址变换方式

1)一级页表地址映射


一级页表地址段映射,是指按1M大小的内存块单元进行的地址映射,查找的过程就是找到页表基地址和当前需要转化的虚拟地址的高12位为索引的页目录项,由于每个目录项都是4字节对齐的,所以应该为:页表基地址+虚拟地址高12X 4,从上图中可看出一级描述符的地址总是4字节对齐的,即后两位为0.一级描述符地址中存放的是一级描述符,一级描述符的格式定义如下:
映射实例: 题目:把内存的地址从0x100000-0x200000空间映射成虚拟地址0xc0100000-0xc0200000的地址空间.

(第一步)根据图1的介绍,我们先把内存虚拟地址右移20位:

Table index = (0xc0100000>> 20) = 0xc01

(第二步)我们打算用内存地址0x4000-0x8000的内存空间内作为存放页表的内存地址。

所以把0x4000写到C2寄存器。注意0x4000正好是16k对齐。所以这里的一级描述符地址为:

一级描述符地址:(0x4000 + (0xc01 << 2))

第三步)我们根据需要把该虚拟地址映射到实际的物理地址的需求,来构建一级页表描述符:

根据图2,我们为了取得被映射的物理地址基地址,需要将物理地址右20位:

Sectionbase address = (0x100000 >> 20) = 0x1

AP,Domain, C,B属性在实例中不做设置。所以最终的一级页表描述符为:

一级页表描述符 = (0x1 << 20) + 0x12 =0x100000 + 0x12 = 0x100012

然后把这个0x100012写到一级描述符地址指向的内存中去。

这样当我们需要访问虚拟内存地址0xc0100000的时候,CPU需要做的事情就是读取C2寄存器,找到页表基地址0x4000,然后根据0xc0100000 >> 20index索引找到一级描述符基地址(0x4000 + (0xc01 <<2)),然后读取这个地址里面的一级描述符:0x100012,得到段映射的物理基地址0x100012 >> 20,然后再与虚拟地址的低20位相加,得到对应的物理地址0x100000.


2)二级页表地址映射
二级页表的映射查找过程其实就是,找到页表基地址,然后找到一级描述符,然后通过一级描述符找到二级页表的基地址,然后再找到二级页表的描述符,通过二级页表描述符来找到对应的物理地址基地址。
二级描述符结构:
二级描述符的说明可以参考一级描述符的描述。
3)一级,二级页表地址映射的过程图:
目录项和页面表都是存放在内存中的表。虚拟地址和物理地址的转化就是查找这些表的过程。

附件: 您需要登录才可以下载或查看附件。没有帐号?本站只开放邀请码注册,QQ:82475491,索要邀请码
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

返回列表
网页右侧QQ悬浮滚动在线客服
网页右侧QQ悬浮滚动在线客服