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

article/2025/9/18 11:00:01

目录

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


http://chatgpt.dhexx.cn/article/GvYWpVy5.shtml

相关文章

junit runwith

junit的runwith是给单元测试中增加一些附属特性,今天在看flink源码的时候,发现其使用了一个注解RunWith(Parameterized.class),有点好奇,于是研究了一下这个注解的使用。 这个注解产生的背景是这样的:flink中的每个功能…

springmvc--@runwith(springrunner.class)报错

目录 解决方法  1)代码 这是一个文件上传的测试类 不重要,重要的是 RunWith(SpringRunner.class)报错! import com.github.tobato.fastdfs.domain.StorePath; import com.github.tobato.fastdfs.domain.ThumbImageConfig; import com.github.tobato.fastdfs.service.FastF…

run()和start()方法区别

多线程原理:相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等CPU选中你就是轮到你,你就run(),当CPU的运行的…

关于@RunWith注解的一点问题

问题引入 今天在用IDEA写一个springboot测试的时候,碰到了一个问题。 SpringBootTest public class ServiceTest {Autowiredprivate IUserService userService;Testpublic void testSelectById(){User byId userService.getById(1);System.out.println(byId);} }…

Java学习笔记-@RunWith(SpringRunner.class)

我们在进行Test测试时,除了要保证测试的包和启动包是同一个路径下,并且需要在Test测试类上加上RunWith(SpringRunner.class)注解,否则的话会直接报一个NullPointerExecption的错误! RunWith(SpringRunner.class)的作用&#xff1…

@RunWith和 SpringJUnit4ClassRunner ----junit4和Spring一起使用

今天在看Spring的Demo的时候,看到了如此单元测试的写法 如下: RunWIth(SpringJunit4ClassRunner.class) ContextConfiguration(locations {"classpath:applicationContext.xml"} public class MyTest { Test public void hehe() { //....... }…

@RunWith(SpringRunner.class)测试SpringRunner.class爆红

SpringRunner报红无法添加类,上pom.xml文件中去掉scope标签内容即可。如下图所示 然后再点击右边侧面的Reload All Maven Projects即可 方法2 如图所示,直接altenter强制 以上两种方法都不可用的时候,这个时候就得手动导入jar包了&#xf…

Java学习笔记-@RunWith(SpringRunner.class)的作用

建议阅读:https://blog.csdn.net/u011835956/article/details/113950577 注意:Test都是基于Junit写的case,并不是基于TestNg框架,如果是TestNg框架的话,应该要继承AbstractTestNGSpringContextTests,这样b…

SpringBoot在使用测试的时候是否需要@RunWith?

我们在使用SpringBoot进行测试的时候一般是需要加两个注解: SpringBootTest 目的是加载ApplicationContext,启动spring容器。 RunWith 是一个测试启动器,可以加载SpringBoot测试注解让测试在Spring容器环境下执行。如测试类中无此注解&#…

SpringBootTest单元测试—加入@Test无法启动测试方法,什么情况下需要加@RunWith(SpringRunner.class)?

spring环境下单元测试: SpringBoot环境下单元测试: 一、SpringBoot2.4.0之后 二、2.2.0 < SpringBoot < 2.4. 三、SpringBoot2.2.0之前 最近写SpringBootTest单元测试时&#xff0c;加入Test无法启动测试方法&#xff08;我用的是SpringBoot2.2.0之前的版本&#xff09;…

Run Run Run

学习了 2022 年集训队论文 《浅谈与 Lyndon 理论有关的字符串组合问题》 写得很好&#xff0c;像我这样的字符串小白也能看懂 Lyndon 分解 若字符串 w w w 小于它的每一个真后缀&#xff0c;则称 w w w 是 Lyndon 串。若字符串 w w w 是 Lyndon 串&#xff0c;则 w k w ′…

关于springboot在启动测试类时报错的问题和@RunWith的使用

【1】最重要的一点&#xff1a;测试类启动依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupI…

天呐!惊人的Springboot测试.Springboot测试类之@RunWith注解

Springboot测试类之@RunWith注解 Springboot测试类之@RunWith注解Springboot测试类之@RunWith注解 @runWith注解作用: @RunWith就是一个运行器@RunWith(JUnit4.class)就是指用JUnit4来运行@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境,以便在测试开…

SSM中使用测试类RunWith

RunWith(SpringJUnit4ClassRunner.class) 需要使用两个测试包 <!--测试包--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.2.7.RELEASE</version></dependency>…

@RunWith的使用

文章目录 RunWith作用RunWith(SpringJunit4ClassRunner.class) 使用说明测试ActiveProfiles("dev") RunWith作用 RunWith 就是一个运行器 RunWith(JUnit4.class) 就是指用JUnit4来运行 RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境 RunWit…

使用命令行创建文件夹和创建文件

进入到指定的目录之后&#xff0c;使用命令&#xff1a;mkdir可以创建新的目录&#xff0c;使用示例&#xff1a; 创建文件&#xff0c;可以使用命令touch&#xff0c;示例&#xff1a;

cmd命令窗口如何创建和删除文件、文件夹,写入内容到文件

首先&#xff0c;同时按住键盘 winR&#xff0c;调出运行窗口&#xff0c;如下图所示&#xff1a; 接下来&#xff0c; &#xff08;1&#xff09;创建文件夹。 使用【 md 文件名 或 mkdir 文件名 】来创建。 完整命令是 md 盘符:\路径\文件夹名&#xff0c;如下图所示&#x…

如何在指定文件夹打开cmd

方法一 1.进入指定的文件夹 &#xff0c;然后选中地址栏&#xff0c;并输入cmd&#xff0c;如下图所示&#xff1a;2.回车&#xff0c;就可以打开对应路径的cmd窗口了&#xff0c;如下图所示&#xff1a; 方法二 1.进入指定的文件夹&#xff0c;按住Shift建鼠标右键&#xff0…

shell、cmd创建文件软连接

&#xff08;一&#xff09;macos shell 一、软链接创建1、创建软链接 ln -s 【目标目录】 【软链接地址】 【目标目录】指软连接指向的目标目录下&#xff0c;【软链接地址】指 “快捷键” 文件名称&#xff0c;该文件是被指令创建的 软链接创建需要同级目录下没有同名的…

windows cmd命令行新建文件,编辑文件,删除文件命令

新建文件 type nul>文件名 编辑文件 copy con 文件名 开始编辑 CTRLz回车保存 删除文件 del 文件名