简谈MMU与SMMU

在服务器的处理器firmware开发中,经常会遇到大家讨论MMU和SMMU的概念,而且会进一步讨论的相关的TLB和huge TLB概念。实不相瞒,一开始我是非常懵逼的,只是写code而已,最多是有用到MMIO来写device的寄存器,MMU和SMMU对我来说完全透明无感。

不过了解了MMU和SMMU之后,就不会再这样想了。

MMU是memory management unit的缩写,提供虚拟地址和物理地址的转换,为CPU提供硬件的内存访问机制。换句话说,不管我们是在user mode还是kernel mode开发,只要是通过CPU来执行指令集,而CPU又选择了enable MMU的feature(现代CPU基本都是enable CPU的),那么我们所写的代码一定有虚拟地址和物理地址的转换,也就是用到了MMU。

MMU是以页表管理机制为基础的,我们以ARMv7-A中的二级页表查询过程为例,当MMU中的TLB模块没有命中时,MMU的查询过程如下,最后会通过页表查询完成虚拟地址到物理地址的转换。(参考:奔跑吧Linux内核入门篇(笨叔,陈悦) 9.1.4 章节)

简谈MMU与SMMU_第1张图片

而SMMU的全程是system memory management unit,也是负责虚拟地址和物理地址的转换,不过和MMU不同的之处在于,SMMU的服务对象不是CPU,而是IO设备和加速引擎。在服务器架构中,不单单只有CPU来访问物理内存,GPU这样的加速引擎也会需要访问物理内存,这时SMMU就为其提供了硬件的物理内存访问机制。(参考:鲲鹏处理器架构与编程(戴志涛 刘健培): 3.3.3 章节)

简谈MMU与SMMU_第2张图片 

 

你可能感兴趣的:(arm,arm,硬件架构)