MMU和SMMU/IOMMU使用场景和区别,SMMU技术与cache

目录

1.各种MMU

2.各种MMU的使用场景

2.1 各自的使用场景

        2.1.1 地址转换

2.1.2 内存保护

3.MMU和SMMU的区别

4. MMU/SMMU/IOMMU与cache

5.扩展阅读


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等概念。

可参考

CPU体系架构-MMUhttps://nieyong.github.io/wiki_cpu/CPU%E4%BD%93%E7%B3%BB%E6%9E%B6%E6%9E%84-MMU.html

2.1 各自的使用场景

        2.1.1 地址转换

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

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

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

还有soc的软硬件交互时,多个用户程序和多个硬件设备的交互,这里面的内存空间如何管理?对于DMA来说就需要一个SMMU/IOMMU.

        以下的参考文献就给出了SMMU的应用场景

4.8.1 SMMU介绍(1)——背景&应用https://zhuanlan.zhihu.com/p/105005488

2.1.2 内存保护

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

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

3.MMU和SMMU的区别

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

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

下面的知乎专栏以ARM的SMMU为例讲解了SMMU技术

SMMU和IOMMU技术 [一] 兰新宇https://zhuanlan.zhihu.com/p/75978422

SMMU和IOMMU技术 [二]https://zhuanlan.zhihu.com/p/76643300

4. MMU/SMMU/IOMMU与cache

 MMU/SMMU/IOMMU中页表的读写会用到cache。涉及到一个TLB的概念。

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

5.扩展阅读

Linux iommu和vfio概念空间解构https://zhuanlan.zhihu.com/p/27026590ARM存储管理系统MMUhttps://blog.csdn.net/gameit/article/details/13169515什么是mmu?为什么要用mmu?https://blog.csdn.net/KUNPLAYBOY/article/details/121157550

以下是一个使用SMMU的例子: ``` #include <linux/iommu.h> static struct iommu_domain *smmu_domain; static int smmu_probe(struct platform_device *pdev) { /* 初始化SMMU */ smmu_domain = iommu_domain_alloc(&platform_bus_type); if (!smmu_domain) { dev_err(&pdev->dev, "Failed to allocate SMMU domain\n"); return -ENOMEM; } /* 添加设备到SMMU域中 */ if (iommu_attach_device(smmu_domain, &pdev->dev)) { dev_err(&pdev->dev, "Failed to attach device to SMMU domain\n"); iommu_domain_free(smmu_domain); return -ENODEV; } return 0; } static int smmu_remove(struct platform_device *pdev) { /* 从SMMU域中移除设备 */ iommu_detach_device(smmu_domain, &pdev->dev); /* 释放SMMU域 */ iommu_domain_free(smmu_domain); return 0; } static const struct of_device_id smmu_of_match[] = { { .compatible = "arm,mmu-500" }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, smmu_of_match); static struct platform_driver smmu_driver = { .probe = smmu_probe, .remove = smmu_remove, .driver = { .name = "smmu", .of_match_table = smmu_of_match, }, }; module_platform_driver(smmu_driver); ``` 这个代码片段是一个SMMU驱动程序的框架,它通过调用`iommu_domain_alloc()`函数分配一个SMMU域,然后通过调用`iommu_attach_device()`函数将设备添加到SMMU域中。当设备被移除时,它会调用`iommu_detach_device()`函数将设备从SMMU域中移除,并释放SMMU域。 在实际的驱动程序中,还需要为SMMU设备提供具体的操作函数,如`iommu_ops`结构体中的`map()`、`unmap()`、`flush_iotlb_all()`等。这些函数将被SMMU核心调用以执行特定的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值