写在前面
前面博客已经了解过。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来操作虚拟地址。
DMA控制器不属于某一个外设,而是通常作为IP(Intellectual Property)核心集成在SOC中。它是SOC设计中的一个重要组成部分。
DMA与外设是什么关系?
我们可以把它理解为使外设和内存之间的桥梁(硬件),用于外设与内存之间提供高速数据传输。在SOC中,外设可以绕过CPU直接通过DMA将批量数据传输到内存。这样会大大减少CPU被中断的次数,提高系统的运行效率。
一,SMMU简介
本文基于QCOM平台的S