论MMU&SMMU&IOMMU

1.各种MMU

MMU是Memory Manage Unit 内存管理单元;

SMMU是System Memory Manage Unit 系统内存管理单元;

IOMMU和SMMU的功能基本相同,只是不同厂商的叫法。

2.各种MMU的使用场景

地址转换

MMU是cpu和各种处理器对应的内存管理单元;

SMMU/IOMMU是DMA使用的内存管理单元

MMU/SMMU的发展是围绕着虚拟内存管理(Virtual Memory Management)技术,就产生了分页技术,虚拟地址,地址空间,TLB,MMU等概念。

MMU是处理器与内存之间的VA和PA的地址转换,个人理解是用户程序在处理器执行过程中将用户程序编译链接之后分配的虚拟地址转化为物理地址。所以多个用户程序的虚拟地址可以重叠,但是多个程序同时运行时会被分配到不同的物理地址。这样用户程序不用关心实际的地址分配。

有了MMU可以在OS上运行超过系统内存的程序,此时通过OS设置的交换分区(通常是硬盘)通过将不活跃的内存中的数据放入交换分区,操作系统可以腾出其空间来为其它的程序服务。虚拟内存是通过虚拟地址来实现的。

那么SMMU/IOMMU怎么使用呢?在soc中假设有一个video DMA(VDMA) 读一张大图像,在VDMA希望这个图像是连续地址空间存储的,这样只需要配置一个基地址。但实际上可能DDR中没有这么大一块连续存储。这时就可以使用SMMU了。

内存保护

MMU/SMMU/IOMMU另外一个重要作用就是内存保护。

根据需要对特定的内存区块的访问进行保护,通过这一功能,我们可以将特定的内存块设置成只读、只写或是可同时读写。

3.MMU和SMMU的区别

1.一个供处理器使用,一个供DMA使用(DMA是一个广义的说法,就是soc中那些可以大量读写DDR的ip/外设等)

2.SMMU更复杂一点,多了streamID,STE:Stream Table Entry和CD: Context Descriptor的概念。在SMMU中,一个发起DMA传输(transaction)的设备的信息由一个Stream Table Entry(STE)来描述。所有的STEs共同构成了Stream Table,可由StreamID作为Stream Table数组的索引,查找得到对应的STE,因此StreamID也就成了设备唯一性的标识。

4.MMU/SMMU/IOMMU与Cache

MMU/SMMU/IOMMU中页表的读写会用到cache。

TLB (Translation Lookaside Buffers)即转换快表,又简称快表,可以理解为MMU内部专用的存放页表的cache,保存着最近使用的PTE乃至全部页表。MMU接收到虚拟地址后,首先在TLB中查找,如果找到该VA对应的PTE就直接转换,找不到再去外存页表查找,并置换进TLB。TLB属于片上SRAM,访问速度快,通过TLB缓存PTE可以节省MMU访问外存页表的时间,从而加速虚实地址转换。TLB和CPU cache的工作原理一样,只是TLB专用于为MMU缓存页表。

### 如何进行 SMMU 设备树 (DTS) 配置 #### 了解设备树基础结构 设备树是一种数据结构,用于描述硬件配置而不依赖于体系结构特定的知识。对于ARM架构而言,设备树源文件(.dts)定义了平台上的所有外设及其属性。 #### 修改SMMU节点 为了启用和配置系统内存管理单元(SMMU),需要编辑相应的`.dts`文件,在其中添加或调整有关SMMU的部分。通常情况下,这涉及到设置如下参数: - `compatible`: 定义兼容性字符串,指明所使用的具体型号。 - `ranges`: 描述地址转换范围。 - `iommu-cells`: 表示IOMMU单元的数量以及它们的意义。 例如,针对某些基于ARM的SoC,可能有类似的条目[^1]: ```dts smmu: iommu@xxxx { compatible = "arm,mmu-500"; reg = <0xXXXX>; interrupts = <...>; /* 中断信息 */ #address-cells = <2>; #size-cells = <1>; ranges; }; ``` 请注意上述代码中的`<0xXXXX>`应替换为实际寄存器基址;中断部分也需要根据实际情况填写。 #### 添加端口连接关系 为了让其他组件能够通过SMMU访问外部资源,还需要建立这些组件与SMMU之间的联系。一般是在各个外围模块下增加子节点来指定其所属的IOMMU域,并提供必要的映射规则。 ```dts &pcie { ... iommus = <&smmu NNNN>; // 将PCIE绑定至第NNNN个流ID所在的上下文银行 }; &gpu { ... iommus = <&smmu MMMM>; // 同样地关联GPU到另一个唯一的流ID上 } ``` 这里假设已经存在名为`smmu`的对象作为全局变量被引用到了不同的IP核当中去。 #### 编译并测试新版本的DTB 完成以上更改之后,应当保存所做的改动并将更新后的`.dts`编译成二进制形式(`.dtb`)供引导加载程序使用。当一切准备就绪后重启目标板卡验证是否正常工作即可[^2]。 ```bash make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- ``` 此命令会依据当前目录下的Makefile自动生成适合该系统的设备树Blob(DTB)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值