【可可扫地僧源码】【伯恩双线指标源码】【android实例源码下载】identitymap源码
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 方法。此类设计仅用于其中需要引用相等性语义的伯恩双线指标源码罕见情况。 此类的典型用法是拓扑保留对象图形转换,如序列化或深层复制。
深入了解iommu系列二:iommu 工作原理解析之dma remapping
深入了解iommu系列二:iommu工作原理解析之dma remapping
序言
上一篇文章主要介绍了iommu硬件架构以及驱动层的初始化流程,本文将深入探讨iommu在虚拟化和非虚拟化场景下dma remapping的工作原理。
非虚拟化场景
非虚拟化场景下,除非在cmdline中明确设置iommu为disabled,否则一般默认启用iommu硬件。iommu=pt的设置会提前建立静态映射。我们将通过内核代码片段分析iommu的dma工作机制。
取自内核e网卡驱动的代码片段,核心逻辑是android实例源码下载将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是钩子注入dll源码否为空(在iommut=pt的情况下不为空)。如果为空则返回false。在不为空的情况下,函数走到identity_mapping,实现如下:
函数首先判断iommu_identity_mapping是否为空,iommut=pt时非空。接着检查设备的domain是否为si_domain,答案肯定。函数返回true,然后走到iommu_should_identity_map(dev, 0),主要判断如下:如果返回false,则从si_domain中删除设备的gps定位监控源码映射;反之,直接返回物理地址。总结,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的问题。