1. SMMU驱动概述
在ARM体系结构中,SMMU(System Memory Management Unit)作为IOMMU的具体实现,负责设备DMA访问的内存管理和地址转换。驱动流程是SMMU功能落地的关键环节,直接决定了系统能否正确完成设备DMA隔离、地址转换等核心功能。
我在实际项目中遇到过这样的场景:某款GPU设备在进行DMA操作时频繁触发页面错误,最终排查发现是SMMU驱动配置的转换表基地址寄存器(TTBR)未正确初始化。这个案例让我深刻认识到,理解SMMU驱动流程的每个细节对系统稳定性至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SMMU驱动初始化流程
2.1 硬件探测与资源分配
SMMU驱动的初始化始于设备树(Device Tree)或ACPI表的解析。以ARMv8平台为例,典型的设备树节点包含以下关键信息:
dts复制smmu: iommu@10000000 {
compatible = "arm,smmu-v3";
reg = <0x10000000 0x20000>;
interrupts = <0 100 4>;
#iommu-cells = <1>;
dma-coherent;
};
驱动加载时首先通过platform_driver_register()注册SMMU驱动,内核会匹配compatible字段并调用probe函数。在probe阶段需要完成:
- 映射寄存器空间:使用
devm_ioremap_resource()将物理地址映射到内核虚拟地址空间 - 中断注册:特别是全局错误中断(Global Fault Interrupt)和上下文错误中断(Context Fault Interrupt)
- 数据结构初始化:包括命令队列(CMDQ)、事件队列(EVTQ)和优先级队列(PRIQ)的分配
关键点:ARM SMMUv3要求所有队列内存必须按照64KB对齐,使用
dma_alloc_coherent()分配时需特别注意对齐参数。
2.2 流表与转换表初始化
SMMUv3采用两级流表结构(Stream Table)来管理设备ID到转换上下文的映射:
- 一级流表(Linear Stream Table):适用于设备数量较少(通常<64)的场
