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
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的介绍以及在虚拟化中的作用就介绍这些。
然后在虚拟机中把网卡绑定内核模块igb_uio,问题是igb_uio的代码没有upstream,依赖于内核版本,提前编译好的内核模块换个版本就不能运行,就想着用vfio-pci,这家伙早早upsteam,一般linux...iommu硬件单元,意思就是qemu没有模拟出iommu硬件单元,把模拟的iommu称为虚拟的iommu,就是viommu。...qemu最早支持intel-iommu和iommu=smmuv3,后来有virtio-iommu,又演化出vhost-iommu,把virtio-iommu部分功能拿到内核来实现。...再重试刚才的request,这样的好处就是软件通用,代码都在IOMMU驱动中,device硬件要配合IOMMU硬件,整体上来说对硬件的要求很高。...好的,到此IOMMU系列写完,希望对大家有用。 参考文献 IOMMU Userspace API vt-d 3.2 spec
惠伟: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模式。
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。
惠伟:IOMMU(四)-dma remappingzhuanlan.zhihu.com MSI 通过DMA写物理地址0x0FEE_XXXX来产生中断,PCI config space中有MSI Address...apic_bsp_setup └─irq_remap_enable_fault_handling └─enable_drhd_fault_handling linux...中断处理子系统有两个很重要的概念就是irq_chip和irq_domain,IOMMU为了支持interrupt remapping也增加了这两个东西。...虽然函数名字有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
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
在使用SSH时,经常会出现用ssh secure shell client连接linux连接不上 解决方法如下: 如果没安装ssh,其安装过程: 1.以root身份登入系统(没登入系统和没有足够的权限都不能安装...看有没正常启动 如果出现: tcp 0 0 *:ssh *:* LISTEN 就说明正常启动了 在windows 下用putty等SSH客户端软件连接测试,或直接在linux...主机上输入 ssh username@localhost 测试,但必须要先安装linux 下的SSH客户端软件包,即 openssh-clients-*,安装过程和上面的服务端包相同 若能成功远程登入...以上方法只在本次设置有效,必须设置开机时所要启动的系统服务:输入 setup 在4(开机时所要启动的系统服务)将ssh设置为开启。 系统设置—setup 功能说明:设置公用程序。
vfio-pci用于标准的pci设备,如果多个虚拟机想用这个pci设备就开启这个pci设备的sr-iov功能,这个pci设备就变成多个标准的pci设备,每个虚拟机用一个。...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中。
apic_bsp_setup └─irq_remap_enable_fault_handling └─enable_drhd_fault_handling linux...中断处理子系统有两个很重要的概念就是irq_chip和irq_domain,IOMMU为了支持interrupt remapping也增加了这两个东西。...虽然函数名字有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
#!/bin/bash #开始安装vsftpd echo ">>> 1. Start install Vsftpd ......" yum -y insta...
惠伟:IOMMU(五)-interrupt remmapingzhuanlan.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。
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模式。
惠伟: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。
【翻译:未开启IOMMU,请设置开启激活,更多有关更多信息,请参阅文档。】...其他PCI硬件,例如:网卡 或者 核心显卡的直通,还需要开启IOMMU分组功能。...在Proxmox VE(PVE)系统开启IOMMU功能实现硬件直通之前,我们要确认CPU是否支持VT-D技术; 开启直通的必要条件 CPU支持VT-D,同时主板要开启VT-D支持。...nano /etc/default/grub 2、在里面找到:GRUB_CMDLINE_LINUX_DEFAULT="quiet"然后修改为 GRUB_CMDLINE_LINUX_DEFAULT="quiet.../default/grub 2、在里面找到:GRUB_CMDLINE_LINUX_DEFAULT="quiet" 然后修改为 GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_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
我们知道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
驱动 内核编译的时候生成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。