zoukankan      html  css  js  c++  java
  • 3.MMU的配置和使用

    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后烧写到开发板:

  • 相关阅读:
    django页面分类和继承
    django前端从数据库获取请求参数
    pycharm配置django工程
    django 应用各个py文件代码
    CF. 1428G2. Lucky Numbers(背包DP 二进制优化 贪心)
    HDU. 6566. The Hanged Man(树形背包DP DFS序 重链剖分)
    小米邀请赛 决赛. B. Rikka with Maximum Segment Sum(分治 决策单调性)
    区间树 学习笔记
    CF GYM. 102861M. Machine Gun(主席树)
    2016-2017 ACM-ICPC East Central North America Regional Contest (ECNA 2016) (B, D, G, H)
  • 原文地址:https://www.cnblogs.com/FORFISH/p/5188784.html
Copyright © 2011-2022 走看看