1.IdentityHashMap具体怎么用的?请教java高手
2.深入了解iommu系列二:iommu 工作原理解析之dma remapping
IdentityHashMap具体怎么用的?请教java高手
/blog/static//
IdentityHashMap
-- ::| 分类: JAVA集合 |字号 订阅
IdentityHashMap
此类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。
换句话说,在 IdentityHashMap 中,当且仅当 (k1==k2) 时,才认为两个键 k1 和 k2 相等(在正常 Map 实现(如 HashMap)中,自动收草机的源码
当且仅当满足下列条件时才认为两个键 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2)))。
此类不是 通用 Map 实现!此类实现 Map 接口时,它有意违反 Map 的常规协定,
该协定在比较对象时强制使用 equals 方法。此类设计仅用于其中需要引用相等性语义的gps源码php罕见情况。 此类的典型用法是拓扑保留对象图形转换,如序列化或深层复制。
深入了解iommu系列二:iommu 工作原理解析之dma remapping
深入了解iommu系列二:iommu工作原理解析之dma remapping
序言
上一篇文章主要介绍了iommu硬件架构以及驱动层的初始化流程,本文将深入探讨iommu在虚拟化和非虚拟化场景下dma remapping的工作原理。
非虚拟化场景
非虚拟化场景下,除非在cmdline中明确设置iommu为disabled,否则一般默认启用iommu硬件。iommu=pt的设置会提前建立静态映射。我们将通过内核代码片段分析iommu的dma工作机制。
取自内核e网卡驱动的代码片段,核心逻辑是tms源码开发将skb地址进行dma映射,以便硬件直接进行dma操作。pci_map_single函数最终调用intel_map_page。当iommu硬件存在(以intel iommu为例)时,它会引导到intel_map_page函数。
我们深入分析这个函数的核心逻辑。首先判断是否为iommu_no_mapping,如果是,则直接返回paddr(物理地址)。接着查看iommu_no_mapping函数的具体实现。从实现来看,首先判断iommu_identity_mapping是室内VR源码否为空(在iommut=pt的情况下不为空)。如果为空则返回false。在不为空的情况下,函数走到identity_mapping,实现如下:
函数首先判断iommu_identity_mapping是否为空,iommut=pt时非空。接着检查设备的domain是否为si_domain,答案肯定。函数返回true,然后走到iommu_should_identity_map(dev, 0),主要判断如下:如果返回false,则从si_domain中删除设备的源码编程入口映射;反之,直接返回物理地址。总结,iommu=pt场景下,由于静态映射的存在,直接返回paddr。为什么直接返回物理地址而不是iova?我们详细解释。
在iommu=pt且硬件支持paasthrough翻译模式下,硬件的DMA到iommu后无需走页表翻译,直接与memory controller交互。但问题来了,iommu硬件如何区分哪些设备的DMA需要页表转换,哪些不需要?为了解决这个问题,我们回顾一下DMA页表的确定过程。
通过分析,iommu通过contex_entry的TT字段来区分。TT为b表示不需要页表转换,从而iommu通过此字段进行区分。
iommu=pt、hw为true的情况已经解释,如果hw为false,逻辑从init_dmars函数开始。在这种情况下,不会提前创建si_domain(即提前做好iova映射)。设备在DMA映射时创建,逻辑在__intel_map_single函数中,部分核心逻辑如下。
虚拟化场景
iommu在虚拟化场景中扮演重要角色,尤其在设备直通场景。虚拟机中没有iommu,guest中使用的dma_ops走noiommu。当guest使用dma_map等API时,返回gpa。在完全模拟设备(如virtio-net或virtio-blk)场景下,内存转换还在mmu层。但在直通设备场景,外设无法直接dma gpa,需要一层转换。接下来我们分析虚拟化场景下iommu的工作。
设置iommu=pt和intel_iommu=on,将vf或pf从原驱动unbind,bind到vfio_pci,初始化vfio层面,对guest内存vfio_dma_map。iommu=pt已解释,我们关注设备unbind和bind到vfio_pci的相关操作。
设备从原驱动unbind时,如果已有si_domain(pt场景下的静态映射),则从si_domain中移除设备。将设备bind到vfio-pci driver时,核心逻辑在vfio_pci_probe函数中。
qemu侧的vfio设备初始化函数vfio_realize,核心逻辑涉及设备所属的vfio_group和container的创建与关联。
vfio_realize中完成与vm dma相关数据结构初始化,并处理dma页表初始化。qemu通过注册memory region listener callback将vm内存映射起来,具体调用逻辑如下。
总结
结合分析,回答了非虚拟化场景下iommu=pt与disabled的区别,虚拟机中dma如何进行,以及不同intel iommu硬件下两个pci设备如何实现直通给同一vm的问题。