本篇参考 arm 官网公开材料 和 小崔的linux 专栏 https://zhuanlan.zhihu.com/p/105005488

宋宝华老师MMU介绍
armv8-armv9 MMU深度学习

MMU简介

MMU是Memory Management Unit的缩写,中文名是内存管理单元。它是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制。

在linux中,用户态使用的内存是虚拟地址(Virtual Address,VA),实际硬件内存称为物理地址(Physical Address,PA)。用户访问内存看到的是VA,内核转化成PA操作实际物理地址。这里要提一下,实际MMU硬件支持2层转化,PA->IPA->VA,但是linux bypass了IPA,简化了流程(加密1次和加密2次效果一样)。

对用户体现虚拟地址,一方面可以起到安全作用(防止直接访问物理地址,查看我们存储的数据),另一方面减少用户对物理内存设备的关注,用户只要关注申请、读写、释放等使用内存操作即可。

DMA简介

操作系统中,内存的使用非常频繁,小到一个进程任务分配堆栈、申请内存,大到设备访问内存(读写等操作)。根据上述MMU功能介绍,这些内存使用都需要经过CPU从VA到PA的互相转化。而CPU的总线固定,一旦访问过多,访问有快有慢等,势必造成总线拥堵,影响性能。

此时加入DMA (Direct Memory Access,直接内存存取)硬件,它与外设和内存连接,将搜集的数据批量传输到内存,然后再发送一个中断通知CPU去内存取,这样减少了CPU被中断的次数,提高了系统的效率。如下图:

由于DMA不能像CPU一样通过MMU操作虚拟地址,所以DMA需要的是连续的物理地址。

smmu

A System Memory Management Unit (SMMU) performs a task that is analogous to that of an MMU in a PE, ** **. It is active for DMA only. Traffic in the other direction, from the system or PE to the device, is managed by other means – for example, the PE MMUs.

SMMU全称System Memory Management Unit,看名字很难理解是做什么的。其实 SMMU 和 MMU具有同样的作用,区别是供使用DMA的外设使用,同样提供页表转换工作,外设可通过页表转换访问物理地址,达到devices设备和进程一样使用虚拟地址。

官方给出的应用1:

如上图:

1)上面SMMU给(使能DMA)device提供地址转换功能。device 使用VA访问内存,smmu根据VA计算对应PA,访问物理内存;

2)下面SMMU一对一连接PCIe Root Complex (which itself hosts a network of endpoints)设备,为PCIE设备提供虚拟地址(通过ATS)功能。

官方给出的应用2:

1)SMMU A为complex device提供地址翻译功能;

2)SMMU B为多个device(使用同个I/O,经过DMA)提供地址翻译功能;

3)SMMU C并行提供多条路径,多个功能,以提供更高带宽,包括:
a. central translation table walker,包括主接口(用于获取翻译地址、初始化页表结构和队列)以及从接口(用于配置访问权限)。
b. 为多个device设备和PCIe提供虚拟化能力。

SMMU和MMU功能一样,为device设备提供地址转换功能,同时提供读写权限、Cache属性,更厉害的是MMU和SMMU可以共页表。

相对不同的是,一个MMU仅支持一个CPU,但是SMMU可以支持多个外设,为了区分这些外设,使用StreamID来标识,同个SMMU的StreamID必须唯一,不同SMMU的StreamID互不影响.

SMMU提供三大功能

1.地址转换功能,虚拟内存,提供1级页表和2级页表的能力;

2.地址读写权限属性、cache属性;

3.地址转换,存储空间扩展功能,比如设备需要地址空间大于物理内存空间;

如上图,smmu最大提供2级页表转换,并可控制 stage1 和 stage2 是否 bypass(bypass:不进行地址转换,直接透传):

  1. 如果SMMU全局接口关闭(SMMU_CR0.SMMUEN == 0),地址不经过翻译直接bypass传输,相当于无smmu器件;

  2. stage1 bypass,只提供IPA->PA; stage2 bypass,只提供VA->IPA;这里理解下,并不是说任一bypass,smmu就无法提供VA->PA的能力,而是只翻译一次。之前提过,linux的IPA是直接bypass,只用一次页表翻译的,所以理论上bypass stage1或stage2,翻译一次即可同linux页表翻译,此时比如只使能stage1,VA->IPA相当于VA->PA;

stream table entry(STE)

SMMU有2个数据结构保存stage1和stage2地址翻译信息,分别是 STE和CD(Context descriptor)

STE(stream table entry):包含stage1初始化信息、CD表指针(CD中包含stage1的页表基地址和相关转换信息)、stage2的页表基地址以及相关转换信息(如果使能stage2的话)
Incoming transaction的stream定位STE。Stream表支持两种格式: Linear Stream Table 和 2-level Strem table.

Linear Stream Table


一个 linear Stream table 是一个连续的STE array,由StreamID从0开始索引。该大小可配置为STE大小的 2n 倍,直到 SMMU 硬件支持的最大 StreamID 位数。所有SMMU实现都支持线性流表格式

2-level Strem table


2-level Stream table 是由一个 top-level table 组成的结构,该表包含指向多个二级表的描述符,这些二级表包含STEs。整个结构所覆盖的 streamid 的跨度可以配置到SMMU支持的最大数量,但第二级表不需要完全填充,大小可能不同。这节省了内存,并避免了对非常大的stream空间进行大型物理连续分配的需求

如上
1)SMMU根据 STRTAB_BASE 查找 STE table,每个设备对应一个streamID,并对应一个STE表。
2)SMMU_(S_)STRTAB_BASE_CFG.SPLIT 决定是 Linear Stream Table 还是 2-level Stream Table 查表方式;
3)Linear Stream Table 方式每个 StreamID 对应一个STE
4)2-level Stream Table方式 StreamID 不同 bit 指向不同STE

Context descriptor(CD)


CD(Context descriptor):包含stage1的页表基地址和相关转换信息;

stage1和stage2相关转换流程,如上图:

1)SMMU根据StreamID和SMMU_STRTAB_BASE查找到设备对应STE表;
2)SMMU检查STE表,STE.Config决定是否进行stage1转换,如果是,则(结合SubStreamID)根据S1ContextPtr指向对应CD表,CD表中包含stage1页表和转换的信息;
3)SMMU根据S2TTB(如果配置的话),查找stage2页表和转换信息;

由上可知每个SubStreamID对应一个CD表,SubStreamID对应每个用户态空间地址,换句话说,每个涉及对应外设的进程,都对应一个SubStreamID。

TLB(Translation Lookaside Buffer)

Translation Lookaside Buffer可翻译为“地址转换后援缓冲器”,也可简称为“快表”。用于存放页表转换关系的 cache,其中存储了当前最可能被访问到的页表项,其内容是部分页表项的一个副本。只有在TLB无法完成地址翻译任务时,才会到内存中查询页表,这样就减少了页表查询导致的处理器性能下降,提高页表转换的效率。

TLB miss:在TLB中没有找到需要查找的页表,需要到配置中查找;
TLB hit:在TLB中找到所需页表;
PTW:Page Table Walk,页表查找过程

SMMU整个查表流程,如上图是页表翻译过程:
1)外设输入VA、StreamID 和 SubStreamID 给SMMU;
2)SMMU 查表 STE 和 CD,找到 stage1 和 stage2 页表转换信息;
3)先通过 TLB 查找页表,找到则计算对应 PA 地址,没找到则根据 STE 和 CD 计算 PA;
4)将PA地址输出;

ARM_SMMU_上相关推荐

  1. 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始!

    转载地址:http://blog.csdn.net/he90227/article/details/45674513 原文地址:http://blog.csdn.NET/jakenson/articl ...

  2. Kubernetes 中 设置pod不部署在同一台节点上

    在k8s中,节点的调度主要由亲和性和污点来进行控制的.   而在亲和性部分由分为了节点亲和性和节点反亲和性.   节点亲和性是指在pod部署时,尽量(软策略)或者必须满足(硬策略)部署在某些节点上. ...

  3. 本地打包Docker镜像上传至阿里云远程仓库(一站式脚本)

    打包镜像上传至远程仓库: 1. 本地项目为 mytest-project 2. 仓库为阿里云镜像仓库 registry.cn-beijing.aliyuncs.com/test/mytest-proj ...

  4. 系统架构升级要不要上微服务?历“久”弥新微服务——你真的需要升级微服务架构吗

    在 <微服务架构设计模式> 一书中,作者总结了关于微服务的一些"重点",原文如下: 中国企业和开发者对微服务架构的热情让我印象深刻.但如同我给所有客户的忠告一样,我想对 ...

  5. springboot设置文件上传大小(tomcat默认1M)

    application.yml # 设置文件上传大小(tomcat默认1M) server:tomcat:max-http-form-post-size: -1 spring:servlet:mult ...

  6. 将文件上传至ftp服务器,FTP文件上传工具类,将文件上传至服务器指定目录

    将文件上传至ftp服务器,传入File对象,将文件上传至ftp服务器 需要配置修改的点: 1. 服务器ip端口(服务器ip 端口22/21). 2. 服务器账号密码(服务器登录用户名密码). 3. 上 ...

  7. 使用feign调用注解在eureka上的微服务,简单学会微服务

    使用feign调用注解在eureka上的微服务. 首先,确保所有服务(调用方与被调用方)都被注册在同一个eureka服务上. 1. 在调用方添加依赖(万事第一步,加依赖) <dependency ...

  8. 将jar包部署在docker上,将jar包打成镜像,使用docker部署jar包

    假设你已经准备好以下东西,即可进行服务部署 一台安装好docker的linux服务器(安装docker见安装docker) 准备好的jar包 接下来开始吧! 将jar包上传至服务器(建好文件夹存放以方 ...

  9. 在docker上安装部署tomcat项目 超简单,拿来主义

    在docker中部署tomcat,非常简单,而且省去了手动安装jdk等步骤,只需要将war包复制在容器tomcat实例中的webapps下面即可.以下将详细讲解流程: 在windows中打好包以后用w ...

最新文章

  1. C++阶段01笔记04【程序流程结构(选择结构、循环结构、跳转语句)】
  2. GDCM:gdcm::Value的测试程序
  3. mysql 迁移表时忽略索引_Mysql迁移新环境索引损坏
  4. springboot 整合jsp过程中的一些问题
  5. c#用canny算子做边缘提取_【图像处理】边缘检测
  6. python数据结构之队列(一)
  7. 2017-10-06-构建之法:现代软件工程-阅读笔记
  8. python自带模块可以控制鼠标吗_python自带模块模拟鼠标和键盘操作
  9. html里面怎么引入swiper,JavaScript库——使用swiper.js创建嵌套的swiper
  10. 编程题目:PAT 1006. 换个格式输出整数 (15)
  11. php如何查看端口有没被占用,如何查看某个端口被谁占用
  12. <EDEM MBD案例02>EDEM-Adams
  13. cad汉仪长仿宋体_cad长仿宋体下载
  14. 运动目标检测——研究现状
  15. docker之安装jdk8
  16. c语言程序评委评分,c语言编程:歌唱比赛评委评分系统
  17. UVA-12304 Race(递推)
  18. 短网址还原的Bookmarklet
  19. 推荐系统应用---新闻资讯类
  20. ssd存储的SLC、MLC、TLC闪存芯片颗粒有什么区别?

热门文章

  1. [附源码]JSP+ssm计算机毕业设计学生毕业离校交接系统4jea2【源码、数据库、LW、部署】
  2. 纸球的40种折法_怎么做纸球的折法步骤图解
  3. SpringBoot项目与maven分环境自动打包配置
  4. solrCloud集群的搭建
  5. STM32 DEBUG会进入0x1fffxxxx处循环
  6. 宋词有感 — 杨俊青
  7. scrapy初步-简单静态爬虫(爬取电影天堂所有电影)
  8. 安卓微信 8.0 内测版来啦!
  9. 蘑菇街java面试题_【蘑菇街Java开发工程师面试的问题会有哪些?】-看准网
  10. 年关近了 这项黑科技火了!