码迷,mamicode.com
首页 > 其他好文 > 详细

3.MMU的配置和使用

时间:2016-02-14 11:36:25      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

3.MMU的配置和使用

前面的基础知识中使用了物理地址来点亮LED灯的,现在,学习了MMU的有关知识,下面就是利用MMU的知识,用虚拟地址来点亮LED灯。而且前面还关闭了MMU所以接下来要使用MMU就得打开MMU。

在前面的学习知道,从虚拟地址映射成物理地址有三种方式的:

  1. 段的方式
  2. 粗页的方式
  3. 细页的方式

接下来就是使用段的映射方式来实现虚拟地址到物理地址的转化。

段的方式的实现步骤:

    1、建立一张Translation table:

技术分享

可以看到段的方式的表的信息。

    2、建立了这张表之后,还要把这张表的基地址TTB(Translation Table Base)写到CP15的c2寄存器里,这样MMU才能找得到这张表。

    3、就是打开MMU。

过程是通过虚拟地址访问物理地址来实现点亮LED灯,而不是像前面一样用物理地址点亮。

代码操作流程:

技术分享

手册资料:

技术分享

上面C和B的功能略图:

技术分享

接下来是看AP位和Domain位:

技术分享

可以看到ARM结构中把存储空间分为了16个域,每一个域都有它的访问权限。我们可以指定要访问的区域是放在哪个域里面。

这里选用的是域0,Domain是在位置5,所以(0<<5)即可。

 

AP的访问:

技术分享

技术分享

上面可以看到,当设置AP为11的时候,无论S位和R位如何设置,都是可读可写的。现在就设置AP为11即可。0b11=0x3,所以实现代码(3<<10)即可。

最后建立页表的代码:

技术分享

2.把建立好的表的基地址写入到CP15的c2寄存器(写入TTB)里:

 

技术分享

技术分享

根据芯片手册的资料,在C程序里嵌入汇编实现写入TTB的操作:

技术分享

这样就把段的基地址写入到CP15的c2寄存器里,完成了设置TTB的工作。

3.接着是使能MMU:

芯片资料ARM Architecture Reference Manual.pdf里:

技术分享

底板手册资料:

技术分享

技术分享

可以看到要使能MMU需要将CP15的c1寄存器的最后一位置为1即可。

实现:

技术分享

注意:到这里其实我们还没设置好,这是因为我们在前面的学习知道:段是有访问权限的,它的访问权限是由AP这两位决定的。然后由于段是属于某一个域的,而每一个域的访问权限是由CP15的c3寄存器决定的。

技术分享

技术分享

技术分享

上面可以看到如果我们把CP15的c3寄存器的值设置为11的时候,访问就不需要权限,所以就设置c3为全1即可.

技术分享

到这里其实还没完成,因为前面我们只是完成了GPIO到物理内存的映射,没有内存虚拟地址到物理地址的映射。接下来就是实现虚拟地址到物理地址的映射。还有在C程序里使用的都是虚拟地址,而不是物理地址。

我们接下来是以虚拟地址和物理地址一致的值进行映射操作:

实现代码:

技术分享

接下来main.c代码实现:

技术分享

技术分享

技术分享

编译make后烧写到开发板:

 

技术分享

技术分享

 

3.MMU的配置和使用

标签:

原文地址:http://www.cnblogs.com/FORFISH/p/5188784.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!