本文主要是介绍Linux内存从0到1学习笔记(8.16 SMMU详解)---更新中,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
写在前面
前面博客已经了解过。SMMU是IOMMU在ARM架构上的实现。主要为了解决虚拟化环境中,GuestOS无法直接将连续的物理地址分配给硬件的问题。对于Hypervisor/GuestOS的虚拟化系统来说,所有的VM都运行在Hypervisor上,每一个VM独立运行一个OS(GuestOS),Hypervisor完成硬件的共享,隔离和切换。那么由于虚拟化系统中,GuestOS看到的内存并非实际的物理内存,因此需要SMMU对DMA设备发出的请求进行翻译,以确保正确的数据传输。所以SMMU实际上就是一个为外设提供的MMU子系统,它主要的作用就是对虚拟地址的管理,映射和翻译,以确保DMA设备能够在虚拟化环境中正常工作。
再来说说DMA?
DMA(Direct Memory Access),即直接内存存取,是一种外部设备与系统内存直接交换数据的接口技术。它允许外设将数据批量传输到内存,然后再发送一个中断通知CPU去处理,这个过程并不经过CPU,从而降低了算力负载。但是,DMA需要连续的物理内存来进行数据传输,应为它不能像CPU一样通过MMU来操作虚拟地址。我们可以把它理解为使外设和内存之间的桥梁(硬件),这样外设可以绕过CPU直接通过DMA将批量数据传输到内存。
一,QSMMU
本文基于QCOM平台的SoC进行拆解。在QCOM平台下,SMMU作为一个子系统负责将虚拟地址转换为物理地址并检查访问权限。SMMU在SoC中执行两个主要功能:内存碎片整理(使用虚拟内存)和访问控制。
这篇关于Linux内存从0到1学习笔记(8.16 SMMU详解)---更新中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!