本篇参考 arm 官网公开材料 和 小崔的linux 专栏 https://zhuanlan.zhihu.com/p/105005488
宋宝华老师MMU介绍
armv8-armv9 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次效果一样)。
对用户体现虚拟地址,一方面可以起到安全作用(防止直接访问物理地址,查看我们存储的数据),另一方面减少用户对物理内存设备的关注,用户只要关注申请、读写、释放等使用内存操作即可。
操作系统中,内存的使用非常频繁,小到一个进程任务分配堆栈、申请内存,大到设备访问内存(读写等操作)。根据上述MMU功能介绍,这些内存使用都需要经过CPU从VA到PA的互相转化。而CPU的总线固定,一旦访问过多,访问有快有慢等,势必造成总线拥堵,影响性能。
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.
1)上面SMMU给(使能DMA)device提供地址转换功能。device 使用VA访问内存,smmu根据VA计算对应PA,访问物理内存;
2)下面SMMU一对一连接PCIe Root Complex (which itself hosts a network of endpoints)设备,为PCIE设备提供虚拟地址(通过ATS)功能。
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互不影响.
1.地址转换功能,虚拟内存,提供1级页表和2级页表的能力;
2.地址读写权限属性、cache属性;
-
如果SMMU全局接口关闭(SMMU_CR0.SMMUEN == 0),地址不经过翻译直接bypass传输,相当于无smmu器件;
-
stage1 bypass,只提供IPA->PA; stage2 bypass,只提供VA->IPA;这里理解下,并不是说任一bypass,smmu就无法提供VA->PA的能力,而是只翻译一次。之前提过,linux的IPA是直接bypass,只用一次页表翻译的,所以理论上bypass stage1或stage2,翻译一次即可同linux页表翻译,此时比如只使能stage1,VA->IPA相当于VA->PA;
如上
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
Translation Lookaside Buffer可翻译为“地址转换后援缓冲器”,也可简称为“快表”。用于存放页表转换关系的 cache,其中存储了当前最可能被访问到的页表项,其内容是部分页表项的一个副本。只有在TLB无法完成地址翻译任务时,才会到内存中查询页表,这样就减少了页表查询导致的处理器性能下降,提高页表转换的效率。