首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏虚拟化云计算

    解惑IOMMU

    IOMMU是个硬件单元 IOMMU和MMU一样是个硬件单元,通常是实现在北桥之中,现在北桥通常被集成进SOC中,所以IOMMU通常都放在SOC内部了。 在SOC上可能有一个或多个IOMMU硬件单元,例如多路服务器上可能集成有多个IOMMU硬件单元。 每个IOMMU硬件单元负责管理挂载到它所在的PCIe Root Port下所有设备的DMA请求。 IOMMU对虚拟化的支持 IOMMU还有一个重要的功能就是加入了对虚拟化的支持,就是文章一开头提到的设备Passthrough。 IOMMU Group 在虚拟化设备透传时还涉及到PCI设备的iommu group分组问题。 根据IOMMU拓扑结构,一个iommu group里可能有一个或多个设备。 另外PCI总线上的设备都归一个iommu group。最后同一个iommu group中所有的设备将会共享一个IOVA地址空间。 关于IOMMU的介绍以及在虚拟化中的作用就介绍这些。

    8.8K32编辑于 2023-03-27
  • 来自专栏虚拟化笔记

    IOMMU(八)-vIOMMU

    iommu硬件单元,意思就是qemu没有模拟出iommu硬件单元,把模拟的iommu称为虚拟的iommu,就是viommu。 qemu最早支持intel-iommuiommu=smmuv3,后来有virtio-iommu,又演化出vhost-iommu,把virtio-iommu部分功能拿到内核来实现。 整体上分为full emulated和hardware assisted emulation,full emulation就是virtio-iommu,纯软件实现iommu的所有功能,性能低,但virtio 再重试刚才的request,这样的好处就是软件通用,代码都在IOMMU驱动中,device硬件要配合IOMMU硬件,整体上来说对硬件的要求很高。 好的,到此IOMMU系列写完,希望对大家有用。 参考文献 IOMMU Userspace API vt-d 3.2 spec

    1.4K11编辑于 2022-04-28
  • 来自专栏虚拟化笔记

    IOMMU(四)-dma remapping

    惠伟:IOMMU(三)-初始化​zhuanlan.zhihu.com DMA remapping就是在DMA的过程中IOMMU进行了一次转换,MMU把CPU的虚拟地址(va)转换成物理地址(pa),IOMMU 的作用就是把DMA的虚拟地址(iova)转换成物理地址(pa),MMU转换时用到了pagetable,IOMMU转换也要用到io pagetable,两者都是软件负责创建pagetable,硬件负责转换 IOMMU的作用就是限制DMA可操作的物理内存范围,当一个PCI设备passthrough给虚拟机后,PCI设备DMA的目的地址是虚拟机指定的,必须要有IOMMU限制这个PCI设备只能操作虚拟机用到的物理内存 io pagetable IOMMU的pagetable和MMU的pagetable一模一样,转换方式也一样,都支持4KB/2M/1G大小的page,都支持4级和5级页表,4级和5级的区别就是va/iova IOMMU工作模式 intel vt-d iommu可以工作于legacy和scale模式。

    2.9K31发布于 2021-05-13
  • 来自专栏虚拟化笔记

    IOMMU(六)-post interrupt

    vt-d post interrupt IOMMU硬件单元也可以借用post interrupt机制把passthrough设备产生的中断直接投递到虚拟机中,不需要虚拟机exit出来,不需要VMM软件介入 interrupt remapping格式变成post interrupt格式,IRTE中内容也变了,它中存放post interrupt descriptor的地址和虚拟中断vector,物理中断到了IOMMU vt-d posted interrupt就是IOMMU硬件单元更新了vcpu的post interrupt descriptor。 但vt-d相比vt-x就弱智多了,一个vcpu有没有运行,运行在哪个物理cpu上,这个vcpu可不可以接收中断,或者vcpu从一个物理cpu迁移到另一个物理cpu,vt-d IOMMU都不能自己判断,只能通过 kvm告诉它,所以kvm就把这些信息写到post interrupt descriptor的其它位中,IOMMU来读,这些位就是SN,NDST和NV。

    2.2K11编辑于 2022-04-28
  • 来自专栏虚拟化笔记

    IOMMU(五)-interrupt remmaping

    惠伟:IOMMU(四)-dma remapping​zhuanlan.zhihu.com MSI 通过DMA写物理地址0x0FEE_XXXX来产生中断,PCI config space中有MSI Address irq_remap_enable_fault_handling └─enable_drhd_fault_handling linux中断处理子系统有两个很重要的概念就是irq_chip和irq_domain,IOMMU 虽然函数名字有pi(post interrupt),但硬件不支持post interrupt的情况也可以搞定,kvm调用irq_set_vcpu_affinity时参数vcpu_info设置为空即可,这样IOMMU intel_ir_set_vcpu_affinity └─modify_irte kvm的物理中断号来自于vfio,vfio_msi_set_vector_signal向系统申请物理中断号,传递给kvm,当外设触发中断后,IOMMU

    1.9K01发布于 2021-05-14
  • 来自专栏frytea

    Debian 开启 IOMMU 支持

    Debian 开启 IOMMU 支持# vi /etc/default/grub 找到 GRUB_CMDLINE_LINUX_DEFAULT="quiet" 修改为 intel: GRUB_CMDLINE_LINUX_DEFAULT ="quiet intel_iommu=on" AMD: GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on" 保存并退出,输入以下命令: update-grub

    1.2K30编辑于 2023-10-21
  • 来自专栏虚拟化笔记

    IOMMU(八)-vIOMMU

    iommu硬件单元,意思就是qemu没有模拟出iommu硬件单元,把模拟的iommu称为虚拟的iommu,就是viommu。 qemu最早支持intel-iommuiommu=smmuv3,后来有virtio-iommu,又演化出vhost-iommu,把virtio-iommu部分功能拿到内核来实现。 整体上分为full emulated和hardware assisted emulation,full emulation就是virtio-iommu,纯软件实现iommu的所有功能,性能低,但virtio 再重试刚才的request,这样的好处就是软件通用,代码都在IOMMU驱动中,device硬件要配合IOMMU硬件,整体上来说对硬件的要求很高。 好的,到此IOMMU系列写完,希望对大家有用。 参考文献 IOMMU Userspace API vt-d 3.2 spec

    2.8K31发布于 2021-08-26
  • 来自专栏虚拟化笔记

    IOMMU(二)-从配置说起

    enable vt-d 意思很明确,BIOS收集IOMMU硬件相关的信息以及它和PCI设备连接关系的信息,通过ACPI的表上报给操作系统 intel_iommu=on 用intel_iommu驱动来驱动 IOMMU硬件单元,IOMMU硬件有intel/amd/arm的等,我们一般用intel的硬件,当然用intel的iommu驱动了。 kvm_iommu_map_pages └─iommu_map └─intel_iommu_map(domain->ops->map) └─domain_pfn_mapping 总结 iommu=pt并不会影响kvm/dpdk/spdk的性能,这三者本质上都是用户态驱动,iommu=pt只会影响内核驱动,能让内核驱动设备性能更高。 补充 kvm一定要用intel_iommu=on,DPDK/SPDK如果绑定vfio-pci那也一定要求intel_iommu=on,如果绑定uio/igb_uio那么就不需要intel_iommu=on

    2.6K31编辑于 2022-04-28
  • 来自专栏虚拟化笔记

    IOMMU(五)-interrupt remmaping

    irq_remap_enable_fault_handling └─enable_drhd_fault_handling linux中断处理子系统有两个很重要的概念就是irq_chip和irq_domain,IOMMU 虽然函数名字有pi(post interrupt),但硬件不支持post interrupt的情况也可以搞定,kvm调用irq_set_vcpu_affinity时参数vcpu_info设置为空即可,这样IOMMU intel_ir_set_vcpu_affinity └─modify_irte kvm的物理中断号来自于vfio,vfio_msi_set_vector_signal向系统申请物理中断号,传递给kvm,当外设触发中断后,IOMMU

    1.4K12编辑于 2022-04-28
  • 来自专栏虚拟化笔记

    IOMMU(七)-vfio and mdev

    dev -r--r--r--. 1 root root 4096 May 28 10:31 /sys/class/vfio/81/dev vfio group不是凭空造出的一个概念,vfio group和IOMMU 硬件的group紧密相关,所以vfio还有一个重要的函数就是vfio_register_iommu_driver,vfio_iommu_type1.ko就调用这个函数给vfio注册了操作IOMMU的ops ,一个设备DMA用到的pagetable就可以通过这个ops配置到IOMMU中。

    4.8K31发布于 2021-05-28
  • 来自专栏虚拟化笔记

    IOMMU(六)-post interrupt

    惠伟:IOMMU(五)-interrupt remmaping​zhuanlan.zhihu.com post interrupt post interrupt是intel提供的一种硬件机制,不用物理cpu vt-d post interrupt IOMMU硬件单元也可以借用post interrupt机制把passthrough设备产生的中断直接投递到虚拟机中,不需要虚拟机exit出来,不需要VMM软件介入 ,IOMMU硬件单元直接IRTE中虚拟中断vector写到post interrupt descriptor中pir对应的位,然后给vcpu所在的物理cpu发送一个中断,中断号就是post interrupt vt-d posted interrupt就是IOMMU硬件单元更新了vcpu的post interrupt descriptor。 kvm告诉它,所以kvm就把这些信息写到post interrupt descriptor的其它位中,IOMMU来读,这些位就是SN,NDST和NV。

    2.7K40发布于 2021-05-18
  • 来自专栏虚拟化笔记

    IOMMU(四)-dma remapping

    DMA remapping就是在DMA的过程中IOMMU进行了一次转换,MMU把CPU的虚拟地址(va)转换成物理地址(pa),IOMMU的作用就是把DMA的虚拟地址(iova)转换成物理地址(pa), MMU转换时用到了pagetable,IOMMU转换也要用到io pagetable,两者都是软件负责创建pagetable,硬件负责转换。 IOMMU的作用就是限制DMA可操作的物理内存范围,当一个PCI设备passthrough给虚拟机后,PCI设备DMA的目的地址是虚拟机指定的,必须要有IOMMU限制这个PCI设备只能操作虚拟机用到的物理内存 io pagetable IOMMU的pagetable和MMU的pagetable一模一样,转换方式也一样,都支持4KB/2M/1G大小的page,都支持4级和5级页表,4级和5级的区别就是va/iova IOMMU工作模式 intel vt-d iommu可以工作于legacy和scale模式。

    3.2K11编辑于 2022-04-28
  • 来自专栏虚拟化笔记

    IOMMU(七)-vfio and mdev

    dev -r--r--r--. 1 root root 4096 May 28 10:31 /sys/class/vfio/81/dev vfio group不是凭空造出的一个概念,vfio group和IOMMU 硬件的group紧密相关,所以vfio还有一个重要的函数就是vfio_register_iommu_driver,vfio_iommu_type1.ko就调用这个函数给vfio注册了操作IOMMU的ops ,一个设备DMA用到的pagetable就可以通过这个ops配置到IOMMU中。

    3K21编辑于 2022-04-28
  • 来自专栏虚拟化笔记

    IOMMU(三)-初始化

    惠伟:IOMMU(一)-简单介绍​zhuanlan.zhihu.com 惠伟:IOMMU(二)-从配置说起​zhuanlan.zhihu.com BIOS收集IOMMU相关的信息,通过ACPI中的特定表组织数据 驱动 内核编译的时候生成IOMMU相关的数据结构,所有IOMMU厂商注册自己的IOMMU硬件的detect/depend/early_init/late_init函数,intel注册了detect_intel_iommu iommu_init符值intel_iommu_init。 | └─iommu_alloc_root_entry ├─for_each_active_iommu | ├─iommu_flush_write_buffer | └─iommu_set_root_entry 的si,如果内核参数iommu=nopt就是类型为IOMMU_DOMAIN_DMA的domain,内核参数没有iommu,默认为IOMMU_DOMAIN_IDENTITY。

    2.7K02发布于 2021-04-27
  • 来自专栏虚拟化笔记

    IOMMU(二)-从配置说起

    ,内核参数配置intel_iommu=on iommu=pt 好多人对这些配置很疑惑,不知道这些配置的是做什么的,配或者不配对性能有什么影响。 enable vt-d 意思很明确,BIOS收集IOMMU硬件相关的信息以及它和PCI设备连接关系的信息,通过ACPI的表上报给操作系统 intel_iommu=on 用intel_iommu驱动来驱动 IOMMU硬件单元,IOMMU硬件有intel/amd/arm的等,我们一般用intel的硬件,当然用intel的iommu驱动了。 kvm_iommu_map_pages └─iommu_map └─intel_iommu_map(domain->ops->map) └─domain_pfn_mapping 补充 kvm一定要用intel_iommu=on,DPDK/SPDK如果绑定vfio-pci那也一定要求intel_iommu=on,如果绑定uio/igb_uio那么就不需要intel_iommu=on

    8.8K03发布于 2021-04-27
  • 来自专栏虚拟化笔记

    IOMMU(三)-初始化

    驱动 内核编译的时候生成IOMMU相关的数据结构,所有IOMMU厂商注册自己的IOMMU硬件的detect/depend/early_init/late_init函数,intel注册了detect_intel_iommu 来检测自己的IOMMU,其它函数都为NULL,finish为0表示检测到自己就不用再检测其它IOMMU硬件了。 iommu_init符值intel_iommu_init。 | └─iommu_alloc_root_entry ├─for_each_active_iommu | ├─iommu_flush_write_buffer | └─iommu_set_root_entry 的si,如果内核参数iommu=nopt就是类型为IOMMU_DOMAIN_DMA的domain,内核参数没有iommu,默认为IOMMU_DOMAIN_IDENTITY。

    1.6K21编辑于 2022-04-28
  • 来自专栏人人都是极客

    没有IOMMU的DMA操作

    我们知道DMA通常需要访问连续的物理内存,除非设备支持iommu,当设备不支持iommu的话可以用以下方式: 在内核启动时为设备保留内存 将MMU内嵌到设备中,如GPU 这里GPU MMU的方式算是个例外 = { .alloc = __iommu_alloc_attrs, .free = __iommu_free_attrs, .mmap = __iommu_mmap_attrs, .get_sgtable = __iommu_get_sgtable, .map_page = __iommu_map_page, .unmap_page = __iommu_unmap_page, .map_sg = __iommu_map_sg_attrs, .unmap_sg = __iommu_unmap_sg_attrs, .sync_single_for_cpu = __iommu_sync_single_for_cpu = iommu_dma_unmap_resource, .mapping_error = iommu_dma_mapping_error, }; 非iommu的话即调用__dma_alloc: static

    3.5K12发布于 2021-04-13
  • 来自专栏LINUX阅码场

    ARM SMMU的原理与IOMMU

    2.2 smmu 与 iommu关系 2.2.1 两者的结构关系 smmu 和 iommu 是何种关系呢? 2.3 dma iova 与iommu dma 和 iommu 息息相关,iommu的产生其实很大的原因就是避免dma的时候直接使用物理地址而导致的不安全性,所以就产生了iova, 我们在调用dma alloc 在__iommu_alloc_attrs函数中调用iommu_dma_alloc函数来完成iova和pa的分配与映射; iommu_dma_alloc->__iommu_dma_alloc_pages, 函数__iommu_dma_alloc_pages中完成的任务是页面分配,iommu_dma_alloc_iova完成的就是iova的分配,最后iommu_map_sg即可完成iova到pa的映射; linux ,来进行全局的tlb的刷新,smmu无需执行太多的指令了; 2.4 smmu和iommu的bypass 方式一:将iommu 给彻底给bypass掉,linux 提供了iommu.passthrough

    6.6K23发布于 2020-10-10
  • 来自专栏虚拟化笔记

    DMA和IOMMU(一)-简单介绍

    IOMMU 类同于MMU,对DMA做地址翻译,用来解决DMA的安全性问题,DMA API同时肩负起了设置IOMMU的职责。 其实IOMMU更大的用处在于用户态驱动,如DPDK和qemu,用于qemu passthrough能更好的理解IOMMU的作用,guest发起DMA时设置的地址是guest_phy_addr,qemu拿到 vfio再给iommu建立表项,如果DMA要和guest_phy_addr交换数据,就和host_dma_phy_addr交换数据,iommu中有个iova,其实这个iova在这儿就是guest_phy_addr kvm device passthrough老方法 kvm_iommu_map_pages └─iommu_map └─intel_iommu_map(domain->ops->map) └─vfio_pin_map_dma └─vfio_iommu_map └─iommu_map └─intel_iommu_map

    7.6K13发布于 2021-02-24
  • 内存管理五大技术概念:MMU、IOMMU、MMIO、mmap、ioremap

    一、MMU 和 IOMMU MMU(Memory Management Unit)和IOMMU(Input-Output Memory Management Unit)都是基于页表的、用于实现地址空间隔离和转换的硬件单元 2.IOMMU IOMMU出现在1990年代,1992年SUN的《sun4m Architecture Porting Guide》文档中描述了他们的I/O MMU和 I/O Cache技术,2000年代中期 IOMMU在不同平台上有不同的叫法。 在X86平台上:AMD称其为 I/O Virtualization(IOMMU),而Intel称其为VT-d;在ARM平台上称其为SMMU;在RISC-V直接称其为IOMMUIOMMU曾经是被放置在独立的芯片比如北桥中,后面,随着CPU集成度的提高,IOMMU的位置也顺势封装到了CPU芯片内部,但位于计算核心之外,紧挨着集成进来的PCIe等I/O控制器。

    1.8K10编辑于 2025-12-16
领券