smmuv3的在内核中的代码路径:drivers/iommu/arm-smmu-v3.c: 上面是smmu驱动中初始化流程的前半部分,从中可以很容易看出来,内核中每个smmu都有一个结构体struct arm_smmu_device来管理,实际上初始化的流程就是在填充着个结构。看上图,首先就是从slub/slab中分配一个对象空间,随后一个比较重要的是函数 arm_smmu...
然而,ARM的SMMU的设计就不是这样的,它使用普通的页表依然可以工作的很好,不需要专门的I/O页表。
如下图所示, STE指明了CD数据结构在DDR中的基地址S1ContextPTR, SSID(substream id)指明了CD数据结构的偏移,如果SMMU选择进行linear, 则使用S1ContextPTR + 64 * ssid 找到CD。如果SMMU选择2-level, 则使用ssid进行二级查找获得CD(与上节STE的方式一致)。 最终找到的CD如下所示: 表中信息包含memory属性,翻译控...
Master理论上可以访问所有的地址空间,可以通过SMMU来对Master的访问进行过滤,只让Master访问受限的区域,那这个区域也可以通过CPU对SMMU建立页表时动态控制。 用户态驱动 现在我们也看到很多系统把设备驱动做在用户态,调用驱动时不需要在切换到内核态,但是存在一些安全隐患,就是用户态直接控制驱动,有可能访问到内核空间,这...
ARM SMMU具有三种接口供软件使用 描述 SMMU具有三种接口供软件使用: 1.Memory-based data structures用于将devices映射到用于地址转换的 translation tables。 2. Memory-based circular buffer queues.用于向SMMU发送命令的Command queue;用于从SMMU接收event/fault的Event queue;以及用于接收PCIe页面请求的PRI queue。
Linux 内核的 IOMMU 子系统相关源码位于drivers/iommu,ARM SMMU 驱动实现位于drivers/iommu/arm/arm-smmu-v3。在 Linux 内核的 SMMU 驱动实现中,做地址转换所用到的数据结构,在上面提到的不同步骤中创建: 流表在 SMMU 驱动程序的初始化过程中创建。如果流表的结构为线性流表,则线性流表中所有的 STE 都被配置为...
(1):arm-smmu-v3.c arm_smmu_probe_device dev_iommu_fwspec_get //获取到device的iommu_fwspec arm_smmu_get_by_fwnode //根据arm_smmu_drivr驱动找设备。。、以及iommu_fwspec->iommu_fwnode (2)iommu.c pci_device_group iommu_group_alloc //分配内存,并创建/sys/kernel/iommu_groups/ ...
[ 19.099235] ===arm_smmu_add_device for dev 0000:04:00.3 num_ids 2 of 0 sid 403 [ 19.099237] ===arm_smmu_add_device for dev 0000:04:00.3 num_ids 2 of 1 sid 80 上述中发现一个dev可能有多个sid,如iommu_fwspec_add_ids函数关联了多个sid的话,最终往iommu_fwspec 中填充sid数组值。
ARM SMMU Data structures概述 描述 ARM SMMU 是一种用于系统级内存管理单元(MMU)的架构,它支持基于translation表中的地址映射和内存属性信息的地址转换。 SMMU使用一组内存中的data structures来获取进一步translation需要的数据。 初始root structure(Stream Table)的base addresses在寄存器中保存。
12 changes: 12 additions & 0 deletions 12 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c Original file line numberDiff line numberDiff line change @@ -894,6 +894,12 @@ static void arm_smmu_cmdq_batch_add(struct arm_smmu_device *smmu,...