ARM SMMU实战:Linux内核DMA内存保护配置全解析
1. ARM SMMU架构精要
在现代异构计算系统中,内存保护机制的重要性日益凸显。ARM SMMU(System Memory Management Unit)作为ARM体系结构中的关键组件,其作用远不止于传统MMU的简单扩展。SMMU通过为系统I/O设备提供地址转换服务,实现了三大核心功能:
- 地址转换:将设备发起的DMA请求中的IOVA(I/O Virtual Address)转换为物理地址
- 访问控制:基于StreamID和SubstreamID的精细化权限管理
- 内存隔离:防止恶意设备越界访问敏感内存区域
与常见的x86平台IOMMU不同,SMMU在架构设计上有几个显著特点:
- 多级流表支持:采用类似CPU页表的层次化结构,支持线性流表和二级流表配置
- 上下文描述符:每个设备关联独立的转换配置(CD),实现进程级隔离
- ATC(Address Translation Cache):专为设备DMA优化的地址转换缓存
// 典型SMMUv3设备树节点示例
smmu: iommu@2b400000 {
compatible = "arm,smmu-v3";
reg = <0x0 0x2b400000 0x0 0x100000>;
#iommu-cells = <1>;
interrupts = <GIC_SPI 74 IRQ_TYPE_EDGE_RISING>;
dma-coherent;
};
2. Linux内核中的SMMU驱动框架
Linux内核的SMMU驱动架构采用分层设计,主要包含以下核心组件:
2.1 驱动初始化流程
SMMU驱动的初始化是一个多阶段过程:
- 硬件探测:读取SMMU_IDR0-5寄存器确定硬件特性
- 数据结构初始化:
- 命令队列(CMDQ):用于向SMMU发送控制指令
- 事件队列(EVTQ):接收SMMU状态通知
- 流表(STE):设备到地址空间的映射关系
static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
{
u32 reg;
reg = readl_relaxed(smmu->base + ARM_SMMU_IDR0);
smmu->features |= FIELD_GET(IDR0_ST_LVL, reg) == IDR0_ST_LVL_2LVL ?
ARM_SMMU_FEAT_2_LVL_STRTAB : 0;
// 其他特性检测...
}
2.2 关键数据结构关系
内核中SMMU相关数据结构形成复杂的关联网络:
struct device
└── struct dev_iommu
└── struct iommu_fwspec
└── struct iommu_ops
└── struct arm_smmu_device
├── struct arm_smmu_cmdq
├── struct arm_smmu_strtab_cfg
└── struct arm_smmu_domain

&spm=1001.2101.3001.5002&articleId=155011154&d=1&t=3&u=cde6bf4b6cc947e7b3afa7511f3f5153)
315

被折叠的 条评论
为什么被折叠?



