Android 底层知识-SMMU
Posted 岩之有理kkk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 底层知识-SMMU相关的知识,希望对你有一定的参考价值。
1.首先了解下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次效果一样)。
对用户体现虚拟地址,一方面可以起到安全作用(防止直接访问物理地址,查看我们存储的数据),另一方面减少用户对物理内存设备的关注,用户只要关注申请、读写、释放等使用内存操作即可。
2.关于DMA简介
操作系统中,内存的使用非常频繁,小到一个进程任务分配堆栈、申请内存,大到设备访问内存(读写等操作)。根据上述MMU功能介绍,这些内存使用都需要经过CPU从VA到PA的互相转化。而CPU的总线固定,一旦访问过多,访问有快有慢等,势必造成总线拥堵,影响性能。
此时加入DMA (Direct Memory Access,直接内存存取)硬件,它与外设和内存连接,将搜集的数据批量传输到内存,然后再发送一个中断通知CPU去内存取,这样减少了CPU被中断的次数,提高了系统的效率。
由于DMA不能像CPU一样通过MMU操作虚拟地址,所以DMA需要的是连续的物理地址。
3.SMMU简述
SMMU全称System Memory Management Unit, SMMU 有着MMU完全一样的能力,区别是供使用DMA的外设使用,同样提供页表转换工作,外设可通过页表转换访问物理地址,达到devices设备和进程一样使用虚拟地址。
SMMU的作用是把CPU提交给设备的VA地址(软件概念的VA),直接作为设备发出的地址,变成正确的物理地址,访问到物理内存上。
MMU通过页表完成这个翻译,SMMU也一样,但SMMU的页表比MMU复杂得多,这受两个要素限制:
第一,一个SMMU控制器可能有多个设备连着,两个设备互相之间可能不会复用同一个页表,需要区分。SMMU用stream id来做这个区分
第二,一个设备可能被多个进程使用。多个进程有多个页表,设备需要对此进行区分。SMMU通过substream id来进行区分
4.优缺点
与内存的直接物理寻址相比,拥有IOMMU的优势包括:
(1)分配大容量内存区域可以不需连续的物理内存——IOMMU可将连续的虚拟地址映射到底层中分段的物理地址。因此,有时可以避免使用向量化I/O(分散-集中列表)::sg table。
(2)不支持寻址整个物理内存长度的设备仍可通过IOMMU访问整个内存,避免了与外围设备的可寻址内存空间复制缓冲区有关的开销。
例如,x86计算机可以用x86处理器中的物理地址扩展(PAE)功能访问超过4GB的内存。但是,普通的32位PCI设备根本无法访问4Gib范围外的内存,并且因此它不能直接访问。如果没有IOMMU,操作系统将不得不实现耗时的反弹缓冲区(也称双缓冲区。)
(3)内存得到保护,尝试进行DMA攻击的恶意设备或尝试传输错误内存的故障设备无权读写非明确分配(映射)的内存。内存保护基于一项事实,CPU上运行的操作系统(见图例)专门控制MMU和IOMMU。设备本身无法绕过或损坏已配置的内存管理表。
在虚拟化中,客户机操作系统可以使用非专为虚拟化设计的硬件。诸如使用DMA直接访问内存的显卡等硬件会有更高性能。在虚拟环境中,所有内存地址都会被虚拟机软件重映射,从而导致DMA设备遇到故障。IOMMU则处理这种重映射,允许在客户机操作系统中使用原生的设备驱动程序。
(4)在某些架构中,IOMMU也执行硬件中断重映射,工作方式类似标准内存地址重映射。
(5)外设内存分页可由IOMMU支持。使用PCI-SIG PCIe地址转换服务(ATS)分页请求接口(PRI)扩展的外设可以检测和表示需要内存管理服务。
对于端口I/O的地址空间与内存的内存地址空间不同的系统架构,CPU与设备通过I/O端口通信时不使用。如果端口I/O与内存的地址空间被映射到一个合适的空间,则可以用IOMMU转换I/O访问。
缺点
与内存的直接物理寻址相比,IOMMU的缺点包括:
(1)性能因翻译和管理开销(例如页表变动)有所下降;
(2)增加的I/O分頁表(转换表)消耗一些物理内存。如果该表可与处理器共享,则此问题可以缓解。
5.虚拟化
当操作系统在虚拟机器内运行时(包括使用半虚拟化的系统,例如Xen),其通常不知道它要访问的内存的主机物理地址。这使其难以直接访问计算机硬件,因为如果客户机系统尝试用客户机的物理地址进行直接记忆存取(DMA)来吩咐硬件,其可能损坏内存数据,因为硬件不知道给定虚拟机客户机物理地址与主机物理地址之间的映射关系。而由管理程序或主机操作系统介入I/O操作来应用翻译则可以避免损坏,但会增加此I/O操作的延迟。
SMMU可以依靠将客户机物理地址映射到主机物理地址的相同或兼容转换表重映射硬件访问地址,从而解决延迟问题。
参考:
https://zhuanlan.zhihu.com/p/27026590
https://zhuanlan.zhihu.com/p/105005488
[转]SMMU代码分析
转自
bus-set_iommu https://blog.csdn.net/tiantao2012/article/details/60768480
attach_dev https://blog.csdn.net/tiantao2012/article/details/57080321
https://blog.csdn.net/tiantao2012/article/details/57082635
同博主一系列的SMMU文章
以上是关于Android 底层知识-SMMU的主要内容,如果未能解决你的问题,请参考以下文章
写给Android App开发人员看的Android底层知识