ARM架构中MMU的作用主要就是将CPU发出的虚拟地址转换成为物理地址,从实现内核和用户程序和用户程序之间的虚拟地址空间隔离。MMU的主要组成为两部分,其一是内部的TLBs缓存;还有就是转换表装换单元。CPU发出虚拟地址会被MMU拦截从而进行地址转换,地址装换过程优先查询MMU内部的Cacha是否有现成的转换条目。如果有则直接映射出物理地址,否则需要转换单元按配置的方式和装换表进行地址装换以得到物理地址,如果成功装换虚拟地址到物理地址则MMU还会新建这-条目。转换后的物理地址就可以被总线拿来访问物理内存了,不过在物理存储之前还需要查询对应的Cacha是否有当前地址的数据的缓存,因为真正的物理存储的访问速度相对于处理器的处理速度是十分缓慢的。如果在cacha中命中了对应的数据则省去了去访问外部存储的时间,反之则需要访问外部存储获取数据,然后更新cacha-----利用程序地址空间局限性提高cacha的命中率。

在启用MMU之前必须先建立好MMU转换需要的转换表,并通过协处理器的特殊寄存器保存转换表的基址。转换表不同的系统的实现方式不同。MMU的映射是以页为单位的,不同的页面size转换是的方式略有差别但是本质的原理流程通用。需要注意的是大的页size能提高TLB的命中率,但是会造成内存的浪费。小的页面能更好的控制内存访问属性和节省内存,但是TLB的命中率就会比较低。

TLB的结构大致如下
TAG    [ASID]       DESCRIPTION
VA    [ASID]       PA + Attributes
VA    [ASID]       PA + Attributes
VA    [ASID]       PA + Attributes
.
.
.

使用后SID的原因是避免应用程序在TLB中的转换条目无法区分的问题,因为用户空间程序的虚拟地址空间都是相同的在TLB中使用ASID进行区分。TLBs中的缓存可能存在过期的情况,如果系统软件修改了装换表,此时应该通过对应的协处理器指令使对应的TLB条目无效,或者粗犷一点直接使所有的装换条目无效。

常见的转换过程有很多种这里说一下两级4K页的转换过程:

两级页面的映射需要两级页表,第一级页表的页面项保存看二级页表的基址,二级页表项加虚拟地址低12bits 描述看物理页面和页面属性。拿一个32位的4K页面的系统来说虚拟地址将分为三个位域,其中最低12位作为业内偏移,余下的20位如何划分取决于实现可按10和10的分法分配,即最高10bits用来表示一级表项在一级页表的偏移,中间10bits则表示二级页表的目录项偏移。一级页表的基址保存在协处理器的基址寄存器中一共有两个TTBR0/1,如果按32位4G空间的映射的话,则一级页表有1024个目录项每一个占四个字节,二级表项每一个也有1024个表项每一个也同样占4个字节。这样下来转换表总共占的内存空间是1024*4+1024*1024*4 < 4.1M的物理内存空间。所以如何安排32位虚拟地址到物理地址之间的映射讲决定装换表所占的内存空间。仔细查上面的页表大小和处理器的要,arm内核要求一级页表必须是对其在16K字节边界上,而二级页表的大小是4K自然也是对其到4K的边界上方便访问,所以一级页表项和二级页表项的低12位一定是为0的,鉴于此低12位就被用来,就被用来描述对应映射到的内存空间的属性信息,这样一级页表项的属性描述的就是4M的物理地址空间的内存属性;进而二级页表项描述的就是一个页的属性。属性主要由权限位和访问属性、缓存属性等信息。

为什么内核硬件上会实现两个装换表基址寄存器TTBR0和TTBR1呢?

使用两个转换表基址寄存器是为了节省内存,避免16K的L1转换表存在N个副本。因为每个进程的装换表中都包括了部分内核的地址空间映射,通常内核区域的映射都是固定不变的所以避免每个进程都重复建立内核部分的地址映射才出现了两个装换表基址寄存器。使用TTB控制寄存器配置虚拟地址最高N个bit都为0时使用TTBR0否则使用TTRB1,这样就能区别使用内核空间或用户空间装换转表基址。假如配置N为7则虚拟地址低32M空间使用TTBR0,如Linux就将其配置为2所以,低0-1G的内核空间使用TTBR0,用户空间使用1-4G的3G虚拟内存空间使用TTBR1。

这里随便一条心得:Linux 自旋锁可以采用WFE和SEV配合以降低功耗。

ARMv7-A 架构下的MMU的更多相关文章

  1. CI Weekly #5 | 微服务架构下的持续部署与交付

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  2. OpenGL Insights 阅读有感 - Tile Based架构下的性能调校 翻译

    Performance Tunning for Tile-Based Architecture Tile-Based架构下的性能调校 by Bruce Merry GameKnife译 译序 在大概1 ...

  3. MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构

    在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...

  4. MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  5. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  6. MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  7. MVC项目实践,在三层架构下实现SportsStore-04,实现分页

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  8. MVC项目实践,在三层架构下实现SportsStore-05,实现导航

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. MVC项目实践,在三层架构下实现SportsStore-06,实现购物车

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

随机推荐

  1. 2021年1月15日【深度学习DeepLearning(python)实战班】

    深度学习网络课程QQ群群号: 1057802989(加群备注:杨春娇邀请) 强化学习QQ交流群群号: 872395038(加群备注:杨春娇邀请)

  2. 深圳某小公司面试题:AQS是什么?公平锁和非公平锁?ReentrantLock?

    AQS总体来说没有想象中那么难,只要了解它的实现框架,那理解起来就不是什么问题了. AQS在Java还是占很重要的地位的,面试也是经常会问. 目前已经连载11篇啦!进度是一周更新两篇,欢迎持续关注 [ ...

  3. 【Android初级】如何实现一个“模拟后台下载”的加载效果(附源码)

    在Android里面,后台的任务下载功能是非常常用的,比如在APP Store里面下载应用,下载应用时,需要跟用户进行交互,告诉用户当前正在下载以及下载完成等. 今天我将通过使用Android的原生控 ...

  4. Mybatis总结(一)

    Mybatis总结(一) 一.Mybatis启动流程(代码层面) 关于config.xml <?xml version="1.0" encoding="UTF-8& ...

  5. https://github.com/golang/go/wiki/CommonMistakes

    CommonMistakes https://golang.org/doc/faq#closures_and_goroutines Why is there no goroutine ID? ¶ Go ...

  6. jasper使用table组件设计复杂的表头

    1.1 设计报表模板 1.1.1 新建模板DemoReport5.jrxml,去掉不需要的Band,保留Title,Page Header,Detail 1 , PageFooter.将组件Table ...

  7. IDEA中jdk设置

    电脑运行环境是8, 但是IDEA提醒说1.5已经过时,IDEA中jdk设置还是比较麻烦 https://blog.csdn.net/u012365843/article/details/8138883 ...

  8. Language Guide (proto3) | proto3 语言指南(六)嵌套类型

    Nested Types - 嵌套类型 您可以在其他消息类型中定义和使用消息类型,如以下示例所示--这里的Result消息是在SearchResponse消息中定义的: message SearchR ...

  9. HTML 5 学习第二课

    元素:<p>+++++++++</P> 全部内容 标签:<P></P> 属性:标签内部的内容 eg:<img src=" "& ...

  10. Flink-v1.12官方网站翻译-P007-Data Pipelines & ETL

    数据管道和ETL 对于Apache Flink来说,一个非常常见的用例是实现ETL(提取.转换.加载)管道,从一个或多个源中获取数据,进行一些转换和/或丰富,然后将结果存储在某个地方.在这一节中,我们 ...