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. 在.NET Core 中使用Quartz.NET

    Quartz.NET是功能齐全的开源作业调度系统,可用于最小的应用程序到大型企业系统. Quartz.NET具有三个主要概念: job:运行的后台任务 trigger:控制后台任务运行的触发器. sc ...

  2. Docker 建站小记

    一,前言 Docker 建站小记,我使用了四个镜像来搭建:nginx,certbot,mysql,gradle.欢迎访问:https://www.zzk0.top 这个网页是从 github 上找的个 ...

  3. Gradle使用及配置

    构建工具:Gradle(6.8) 下载地址:https://gradle.org/releases/ 下载最新版的二进制文件即可,下载"gradle-6.8.1-bin.zip文件,下载后完 ...

  4. Ajax编程基础

    目录 Ajax编程基础 传统网站中存在的问题 Ajax概述 Ajax的应用场景 Ajax的运行环境 Ajax运行原理及实现 Ajax运行原理 Ajax的实现步骤 1.创建Ajax对象 2.告诉Ajax ...

  5. Soul API 网关源码解析 03

    目标 使用 soul 代理 dubbo 服务 dubbo 服务如何注册到网关的? dubbo 插件是如何工作的? 理清 http --> 网关--> dubbo provider 整条链路 ...

  6. git的使用学习笔记--项目版本操作

    一.使用场景 版本回退:上线失败--需要回退到上个版本 二.操作 先编辑  vim text.txt git status git add .       这个命令能看到所有的增加操作 git com ...

  7. 强连通分量 与 2-SAT

    近期一直在刷这方面的题 因为没法学新知识 但又想写点什么 就水篇博文吧 引理 简单来说,在一个有向图中,若所有点之间两两互相直接可达,则将这个图成为强连通分量 强连通分量可以是某个有向图中的子图 求强 ...

  8. EasyExcel导出小结:动态标题、标题格式、相同值合并

    1. 实列相关依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel& ...

  9. Language Guide (proto3) | proto3 语言指南(开篇)

    前言 近日在学习gRPC框架的相关知识时接触到Protobuf(protocol-buffers,协议缓冲区),proto3等知识.网上很多文章/帖子经常把gRPC与proto3放在一起,为避免初学者 ...

  10. vscode 刚安装运行cnpm命令报错

    平时的开发工具什么都用,最近手贱把vscode卸载掉了,然而重新安装时,自已以前的什么配置都没了~~~~~~,又开始从头搞起,但是一切安装配置完毕,执行cnpm命令时报错,晕!!!!!! 解决办法:执 ...