zoukankan      html  css  js  c++  java
  • MMU段式映射(VA -> PA)过程分析

    MMU:内存管理单元。

    CPU寻址的方式:

    未使用MMU:CPU发出地址(PA) 直接内存寻址(SDRAM or DDRx)。

    使用MMU  :CPU发出地址(VA) MMU接收CPU发来的地址 经过某种转换

    变成实际的物理地址去寻址。

    那么是MMU是如何实现VA到PA的转化的呢?

         建立VA与PA的对应关系:

    MMU有段描述符(1M)(还有页描述符大页(64KB)小页(4KB)和极小页(1KB))

    我们这里说段页表的建立。

    比如32位CPU,4G的寻址空间可分为4094个段(4G/1MB)

    所以可以建立4096个对应的关系而实际的内存肯定没到4G(VA-PA 可多对一)

    所以首先要在内存中指定存放该对应表的其实位置(可通过CP15协处理器指定)

    映射表的大概示意图如下

    VA(0-4095)                PA(高12位)

     0              ----        有效PA高12bit + AP + DOMAIN + cacheable + bufferable + 描述符       

     1              ----        有效PA高12bit + AP + DOMAIN + cacheable + bufferable + 描述符     

     2              ----        有效PA高12bit + AP + DOMAIN + cacheable + bufferable + 描述符    

          ···

          ···

     4094       ----        有效PA高12bit + AP + DOMAIN + cacheable + bufferable + 描述符      

     4095       ----        有效PA高12bit + AP + DOMAIN + cacheable + bufferable + 描述符        

    AP:AP权限为所有用户可读写 在多进程时使用 用来保护进程

    DOMAIN:配合AP使用 权限管理

    cacheable :C位 使能MMU缓存

    bufferable :B位 使能MMU缓冲区

    描述符:MMU使用段描述符(还有页描述符大页(64KB)小页(4KB)和极小页(1KB))

    以下是建立1MB映射的C语言描述:

    phyaddr = 0x30000000;

    viraddr   = 0xa0000000; 

    *(mmu_ttb_base + (viraddr >> 20)) = ((phyaddr & 0xfff00000) | 低20位的属性描述);

        VA到PA转化过程:

    CPU发出VA:比如0xa0000123,转化过程如下图:


    OK,到此,便得到了实际的物理地址!


  • 相关阅读:
    ScreenToGif 使用教程
    无问西东
    php如何解决中文乱码问题?
    layer父页面调用子页面的方法
    弹层组件文档
    关于svn获取获取文件时 Unable to connect to a repository at URL"https://..."执行上下文错误:参数错误
    centos下修改文件后如何保存退出
    Linux CentOS 7的图形界面安装(GNOME、KDE等)
    CentOS7安装详解
    Could not attach to pid : "xx"最近启动Xcode运行项目都会出现这个问题,再次启动或者多启动几次,就可以正常运行工程了。
  • 原文地址:https://www.cnblogs.com/alan666/p/8312369.html
Copyright © 2011-2022 走看看