一 总体概述 SMMU处于IO设备和总线之间,负责将设备的输入IOVA转化为系统总线的物理地址PA; SMMU硬件包含configuration lookup/TLB/Page Table Walk以及cmdq/eventq等部分,其中configuration lookup部分查找stream id所对应的配置(ste/cd), 最终指向page table基地址等; SMMU通过configuration lookup找到设备的配置及页表基...
DMA请求到达SMMU,SMMU提取DMA请求中的SID就知道这个请求是哪个设备发来的,然后去StreamTable索引对应的STE 从对应的STE表中查找到对应的CD,然后用ssid到CD中进行索引找到对应的S1 Page Table IOMMU进行S1 Page Table Walk,将VA翻译成IPA并作为S2的输入 IOMMU执行S2 Page Table Walk,将IPA翻译成PA,地址转化结束。 6...
DMA请求到达SMMU,SMMU提取DMA请求中的SID就知道这个请求是哪个设备发来的,然后去StreamTable索引对应的STE 从对应的STE表中查找到对应的CD,然后用ssid到CD中进行索引找到对应的S1 Page Table IOMMU进行S1 Page Table Walk,将VA翻译成IPA并作为S2的输入 IOMMU执行S2 Page Table Walk,将IPA翻译成PA,地址转化结束。 6...
Guest驱动发起DMA请求,这个DMA请求包含VA + SID前缀 DMA请求到达SMMU,SMMU提取DMA请求中的SID就知道这个请求是哪个设备发来的,然后去StreamTable索引对应的STE 从对应的STE表中查找到对应的CD,然后用ssid到CD中进行索引找到对应的S1 Page Table IOMMU进行S1 Page Table Walk,将VA翻译成IPA并作为S2的输入 IOMMU执行S2...
IOMMU进行S1 Page Table Walk,将VA翻译成IPA并作为S2的输入 IOMMU执行S2 Page Table Walk,将IPA翻译成PA,地址转化结束。 6. SMMU command queue 与 event queue 系统软件通过Command Queue和Event Queue来和SMMU打交道,这2个Queue都是循环队列。 Command queue用于软件与SMMU的硬件交互,软件写命令到command queue,...
IOMMU进行S1 Page Table Walk,将VA翻译成IPA并作为S2的输入 IOMMU执行S2 Page Table Walk,将IPA翻译成PA,地址转化结束。 6. SMMU command queue 与 event queue 系统软件通过Command Queue和Event Queue来和SMMU打交道,这2个Queue都是循环队列。 Command queue用于软件与SMMU的硬件交互,软件写命令到command queue,...
IOMMU进行S1 Page Table Walk,将VA翻译成IPA并作为S2的输入 IOMMU执行S2 Page Table Walk,将IPA翻译成PA,地址转化结束。 6. SMMU command queue 与 event queue 系统软件通过Command Queue和Event Queue来和SMMU打交道,这2个Queue都是循环队列。 Command queue用于软件与SMMU的硬件交互,软件写命令到command queue,...
TCU:这个是⽤来直接是跟TBU连接的,负责page table walk或者是configuration table walk(STE、CD的信息等)。TCU主要就是负责把这些信息拿回来,包括event queue的访问等也是TCU。TCU内部也是有⼀些cache,但是不叫TLB cache。 DTI:TBU和TCU之间的双向交互的通信协议。
TLB(地址转换后援缓冲器)用于缓存页表转换关系,提高地址转换效率。TLB miss表示在TLB中找不到所需页表,需到内存中查询。TLB hit则表示在TLB中找到所需页表。PTW(Page Table Walk)是指页表查找过程,是SMMU在查询地址转换时的步骤之一。通过上述介绍,我们对SMMU整个查表流程有了清晰的理解。
static int __arm_lpae_iopte_walk_dirty(struct arm_lpae_io_pgtable *data, struct io_pgtable_walk_data *walk_data, arm_lpae_iopte *ptep, int lvl);static int io_pgtable_visit_dirty(struct arm_lpae_io_pgtable *data, struct io_pgtable_walk_data *walk_data,...