您的位置:首页 > 其它

ARM920T内存管理单元MMU

2013-12-07 15:23 435 查看
作为程序员已经有4~5个年头了,发现学的知识杂且乱,很多学习过的东西,有时也会忘记。索性开始整理,由于是电子专业出身,于是想把之前玩过的2440开发板,重新再玩一遍。顺便对各个知识点进行较全面的总结。

主要参考资料是2440官方的PDF资料以及韦东山嵌入式linux应用开发手册,用的开发板是FL2440.

由于用的是64位的服务器编译,所以采用的交叉编译工具链是用openwrt-dreambox编译出来的基于S3C2440的交叉编译工具链进行编译。

韦东山的前几章节阅读起来较为容易上手,因此决定从第7章内存管理单元MMU开始总结有关S3C2440使用以及软硬件处理方式。后续会深入到uboot以及内核,以及文件系统等等。

发现扯了一堆,还是直接入正题吧。

本文主要参考ar920t的technical reference manual,以及韦东山嵌入式linux应用开发手册。有电子版可供下载。

MMU的主要工作是虚拟地址到物理地址的映射。



arm920T MMU的特性

我总结比较重要的几点:

4种映射长度,段(1MB)、大页(64KB)、小页(4KB)、极小页
对每段都可以设置访问权限。
大页、小页的每个子页(sub-page,即被映射页的1/4)都可以单独设置访问权限。
硬件访问页表。硬件实现16个域。

指令TLB(64个), 数据TLB(64个)。
TLB条目采用round-bin算法。

虚拟地址大家都知道32位的cpu为4GB,物理地址由于一般外存芯片的大小有8M 16M 32M 等等。FL2440的外存SDRAM大小为64M由2片32M的级联组成。

VA MVA PA

ARM和cpu地址之间的转换涉及3个概念。VA MVA PA,韦东山讲的很清楚。我这里简单说明,cpu核发出VA, VA被转换成MVA供cache和mmu使用。在这里MVA被转换成PA,最后使用PA读写内部寄存器或者外部设备。

VA与MVA关系图如下:



如果VA<32M,那么 MVA的值需要使用进程标识号PID(读取CP15的寄存器13) 来转换,MVA = VA + (PID x 32MB). 即 MVA = VA | (PID << 25), 这里,如果PID = 0,则MVA = VA.

如果VA>=32M,那么 MVA=VA.

虚拟地址到物理地址的转换过程

这里主要理解几张关系图,就能明白转换过程是怎样的。

首先是页转换表,也是最主要的一张:



第一级转换,根据TTB的base以及MVM[31-20] 得到第一级页表描述符,根据描述符的不同,可以分为是段,粗页,还是细页。如果是段,则在第一级转换后,段基址加MVM偏移量即可得到实际物理地址,转换结束。

如果是粗页或者细页方式,那么需要进行第二级转换,第二级转换后,粗页表又可分为大页方式或者小页方式进行地址映射。 而细页表可以分为大页,小页,以及极细页方式地址映射。

这里提个问题:在第二级转换中,以粗页表进行二级地址映射时,为什么只能以大页方式或者小页方式进行地址映射,而不能以极细页方式呢?这个问题后续解答。

根据以上转换图总结有几点:

TTB base 页表基址寄存器,其结构如图:



其中[13:0]为零。

在第一级取址时,是这样的过程:TTB中的[31-14],加上MVA中的[31-20],加上末位2位填零,组成第一级地址。通过第一级地址去取一级页表描述符。

见下图



2. 一级页表描述符



一级页表描述符中的低2位决定是段基址还是粗页基址还是细页基址。

如果是段基址,可以看到表3-4中用31-20位表示段基址,MVA的[19-0]表示段index。 一级页表描述符[31-20] + MVA [19-0] 组成一个实际的PA.此时,一级转换已完成,直接得到实际物理地址,转换结束。

如果一级页表中是粗页地址或者细页地址,则要进行二级转换,才能得到PA。

3. 二级页表描述符



二级页表描述符中最后2bits决定是大页,小页,极细页方式地址映射。其余位是访问控制位,后续详解。

4. 我们来看下粗页表的大页方式地址转换过程:



首先TTB[31-14] + MVA[31-20] 得到第一级页表描述符。如果是粗页表,第二级页表地址是如下构成: L1[31-10] + MVM[19-12] + BIT[1-0] ,其中低2位为零。根据第二级页表地址找到第二级页表描述符,那么实际的物理地址组成:

L2[31-16] + MVA[15-0]。

表3-10中有个trick,L2 table index 和 page index有重合位,韦东山讲的很清楚,当位[15-12] 从0b0000变化到0b1111时, 第二级页表地址有16个不同地址,但其中存储的大页描述符是相同的。所以每连续16个地址保存相同的大页描述符。

这里很明白,因为第一级转换后,得到粗页表的总大小是1MB,而粗页表的entry有256条(MVM[19-12]),每个entry的大小为64KB(MVM[15-0]),256×64KB = 16348KB 恰好是16MB, 因此必然每16个二级页表地址对应一个大页描述符。

说到这里,上面的问题,也很容易想明白了,如果粗页表以极细页方式进行映射,那么页表大小变为:256×1KB=256KB,这样根本无法映射完1MB,所以只能是INVALID。

5. 粗页表小页方式地址转换



和粗页表大页方式地址转换类似,一级页表描述符地址 = TTB[31-14] + MVA[31-20] + bit[1-0] ;二级页表描述符地址 = L1[31-10] + MVA[19-12] + bit[1-0]; 物理地址 = L2[31-12] + MVA[11-0]; 这里就没有重叠部分了,因为以小页方式映射,页表大小 = 256 × 4KB = 1MB,大小刚好。

6. 细页表极细页方式映射

细页表以大页或小页方式和粗页表类似,不再赘述。

细页表以极细页方式映射图如下:



内存的访问权限检查

参考韦东山,没什么难点。

TLB

起因: 使用一级页表进行映射, 每次读写需要访问2次内存,第一次访问一级页表获得物理地址,第二次才是真正的读写数据;使用两级页表进行映射,则需要3次访问内存(访问2次页表,第3次读写数据)。

地址转换过程大大降低了cpu性能,需要一个类似cache的机制来缓存页表条目(段,大页,小页,极小页的描述符),因此TLB出来了,(Translation Lookaside Buffers).称为 “转译查找缓存”

工作过程见韦东山。

注意点: 必须保证TLB中的内容与页表一致。

方法: 在启动MMU之前,使无效整个TLB,改变页表时,使无效所涉及的虚拟地址对应的TLB的条目。

CACHE

指令cache

数据cache

详见韦东山。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  arm9