问题标签 [iommu]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4015 浏览

memory-management - DMA 和 IOMMU 有什么区别?

  • 什么是 DMA 和 IOMMU?DMA 和 IOMMU 是如何使用的?
  • 如果架构不支持 IOMMU 怎么办?
  • 如何在没有 IOMMU 的情况下使用 DMA?
0 投票
1 回答
611 浏览

virtual-machine - 如何在访客上启用 IOMMU

我计划使用 GPU 设备执行嵌套虚拟化。我正在运行来宾 Ubuntu 操作系统,并且通过在主机上启用 intel_iommu 并将 NVIDIA PCI 配置为 vfio-pci 设备,我已将 GPU 映射到它。我还可以在客户机上安装 NVIDIA 驱动程序并将其用于深度学习。

但是,现在我想在来宾内部运行另一个 VM,让我们将在主机上运行的来宾称为 L1,将在来宾上运行的来宾称为 L2,我希望 L2 来宾可以访问 GPU,我遇到了支持的 vIOMMU在 Q35 Qemu 芯片组上,如何在 L1 客户机上启用 IOMMU,以便我可以将 gpu 直接传递给 L2 客户机?

硬件:英特尔 i7 第 8 代 NVIDIA GeForce 1070 Linux - Ubuntu 18.04,管理程序 - KVM

0 投票
0 回答
143 浏览

linux-kernel - IOMMU 如何通过 DMA 取消映射来自不同外设的 IOVA

我一直在努力获取这方面的信息,但仍然没有任何可靠的信息。所以,到目前为止我学到的是 IOMMU 将 DMA 提供的 IOVA 转换为物理地址,并从/向内存读取或写入。我的问题如下:

1) IOMMU 是否为每个设备存储不同的内存映射?每个设备是否在其虚拟地址空间中看到从零开始的地址范围

2)这些IOMMU内存映射存储在哪里?

3) 如果每个设备都在其虚拟地址空间中看到从零开始的虚拟地址,IOMMU 如何知道请求来自哪个设备?

4) 设备是否还传输某种设备特定 ID 或 IOMMU 识别并使用它来取消映射 IOVA 并保护该设备看到或写入的其他内存地址?

0 投票
1 回答
253 浏览

usb - USB端口和(我假设)IOMMU控制器有问题

1

在 BIOS 中启用 IOMMU 控制器时 USB 3.0 端口不工作,但是当我禁用它时,没有其他 USB 工作......(我假设,我无法通过登录窗口,因为我的键盘和鼠标不工作,甚至他们的指示灯也不会亮)。

现在我对这些东西一无所知,也不知道为什么 IOMMU Controller 是这样的。我第一次拿到这台电脑时就是这样设置的。

这就是我输入 'lspci | 时得到的结果 grep -i usb'

0 投票
0 回答
61 浏览

virtual-machine - 裸机上的硬件物理行为与使用 IOMMU 直通的 VM 有什么区别?

我有一些过时的设备用于运行实验装置。不幸的是,该设备只能在使用 FireWire/IEEE1394 的 WinXP 上运行,这对我们来说越来越难以维护硬件。不幸的是,我们也没有钱来更换这些设备。我们讨论了可能尝试在较新的操作系统上虚拟化 XP 环境。我一直在阅读有关 VFIO/IOMMU 的信息,并想也许我可以通过 FireWire PCI 卡并这样做。

再加上 - 我让它工作。我用 QEMU-KVM 管理程序安装了 XP。设置好,通过火线卡,所有都在VM中被识别,包括当我将设备连接到FW卡时。XP 设备管理器看到它就在那里。

不幸的是,我发现与硬件的实际交互充其量似乎是敏感的。事情以奇怪的、无法解释的方式出现。其中一些让我认为来宾操作系统没有与通过卡正确通信。这令人惊讶,因为我的印象是通过卡直接由客户操作系统使用,无需主机操作系统干预。

我的问题基本上是 - 如果我正在虚拟化一个较旧的系统并通过所需的各种端口/卡,它是否应该表现得像裸机一样?或者在某些情况下,来宾操作系统尝试做的事情与裸机不同(即,当指令离开 VM 时,主机操作系统会改变某些东西)?正如我所说 - 我的印象是客户操作系统直接与硬件交互,但经验让我怀疑这是否真的如此。

我想知道这一点的部分原因是,如果使用其他硬件接口的行为异常(电源由计算机控制的 IE 激光器),其他设备会更危险或导致设备损坏。因此,如果来宾操作系统认为它正在做的事情与实际现实脱节,这是一个安全风险,我想在继续之前了解它。

0 投票
1 回答
105 浏览

macos - 在 Thunderbolt 驱动程序中绕过重新映射的目的是什么?

我的问题只是出于好奇,我不是 MacOS Thunderbolt 驱动程序的开发人员,所以我没有这方面的经验。
我在 MacOS 上遇到过有关Thunderbolt 驱动程序和 IOMMU 的页面。据我了解,当驱动程序请求内存地址时,获得的地址不是物理地址,而是IOMMU映射的虚拟地址。我认为这是由于在没有 IOMMU 的情况下使用 DMA 存在安全风险。但是,驱动程序有一些选项可以绕过重新映射,例如调用IODMACommand对象的initWithSpecification方法并将其mappingOptions设置为kBypassed. 然而,在页面中,据说调用这样的方法来获取未映射的物理地址并将其用于 DMA 会破坏驱动程序。
所以我的问题是:在迅雷驱动程序中,如果该地址不能用于 DMA,那么请求未映射的物理地址的目的是什么?
对不起,如果这个问题看起来很愚蠢,但就像我说的我对这种东西没有经验,我只是很好奇。

0 投票
0 回答
510 浏览

linux - 当 intel_iommu=on 时 Linux DMA 32 位 dma_alloc_coherent 错误行为

我正在编写一个 linux 设备驱动程序,以通过 PCI express 将 FPGA 中的 DMA 数据写入 CPU RAM。在英特尔平台上运行 64 位 Centos 8.1,内核 4.18.0-147.3.1。

实现遵循DMA-API-HOWTO。DMA 是32 位的,驱动程序对 DMA 描述符环使用一致的映射。因此,我设置了 DMA 掩码以通知内核有关设备 DMA 寻址能力的信息。

FPGA 和驱动程序设计为执行由 240 个缓冲区描述符组成的环的事务,直到它被用户空间程序停止。缓冲区描述符环和实际缓冲区通过 分配dma_alloc_coherent,在用户空间程序触发事务初始化时映射,最后取消映射。

我面临两种情况:

  1. 启用 SWIOTLB 后,我们的应用程序运行良好。这可以防止使用硬件 VT-d IOMMU,它是 Intel 机器上的默认设置。

  2. 但是,在启用 Intel VT-d IOMMU 时它不起作用

    我第一次运行事务时一切正常,但是从以下 dma 开始,缓冲区初始化失败,因为dma_alloc_coherent不断收到 PTE 错误(来自 DMAR :),它尝试为每个 64k 缓冲区分配的 16 个页面中的每一个页面都有以下消息:

在第二次运行中,它似乎intel_alloc_coherent试图重用一些已经分配的缓冲区。

缓冲区描述符环dma_alloc_coherent没有给出任何警告。缓冲区在每次运行结束时通过dma_free_coherent.

在启用英特尔 IOMMU 的情况下,是否有处理 32 位 DMA 的特定策略?

感谢您提供任何帮助。

0 投票
2 回答
1495 浏览

gpu - VFIO - Intel 4770 上的 igpu 直通到虚拟机(Host Os Proxmox)

我正在运行最新的 Proxmox(此时为 6.3-3,已完全更新)并尝试将我的 Core i7 4770 CPU 上的板载 GPU 传递到 Windows 10 VM。我已经在系统上启用了 iommu,并且还告诉 grub 不要让系统通过添加intel_iommu=on video=efifb:off到 grub 内核选项来声明设备。我已经通过检查 dmesg 验证了 IOMMU 实际上是可用的

我还将 iGPU(和相关的音频设备)添加到黑名单中,以防止主机操作系统声明它:

最后,我在主机上设置了一个新的 Windows 10 虚拟机以及 q35 芯片组和 uEFI (OVMF) BIOS,因为这显然是通过硬件的最“兼容”的方式。我还在 Proxmox 主机的 HDMI 端口中插入了一个外部屏幕。我知道当虚拟机启动时,我应该会看到这个屏幕变得生动起来。VM 的 qemu 配置文件如下:

完成后,我可以启动 VM。一旦我启动虚拟机,屏幕就会进入待机状态,表示没有信号。然后我可以 RDP 进入系统,我看到 Intel HD Graphics 4600 在设备管理器中可见。所以我从英特尔网站安装了最新的驱动程序。不幸的是,该设备将无法启动并在其旁边显示一个感叹号。设备状态显示

Windows has stopped this device because it has reported problems. (Code 43)

不幸的是,这个code 43错误只是意味着出了点问题,它并不是很具体是什么原因造成的。

不太确定从这一点开始尝试什么 - 关于在哪里继续解决这个问题的任何帮助都会很有用。

0 投票
1 回答
87 浏览

kvm - 为什么我的主机操作系统在使用 SR-IOV 时在执行网络的核心上会遇到高系统 CPU 使用率?

我试图确定为什么我的 KVM 主机显示特定来宾的系统 CPU 使用率很高。

我已经设置了一个 KVM 主机(Ubuntu 20.04)来托管一个来宾 VM(Ubuntu 20.04)。我将客户机配置为使用来自套接字 1 中处理器的内核(通过 vcpu / vcpupin / emulatorpin),内存(通过 numatune)连接到套接字 1 中处理器上的通道,并且 NIC(通过接口/地址源)连接到插槽 1 中处理器上的通道,以确保 VM 以最佳状态运行。即使我已经完成了配置 IOMMU、SR-IOV 和 Intel VF 以将 NIC 的虚拟功能 PCI 设备直接传递到 VM 的过程,主机实例仍然看到来宾停放的内核上的系统 cpu 使用率很高这是网卡中断。

我无法弄清楚为什么涉及主机系统,因为 PCI 设备与主机断开连接并直接连接到来宾。这会导致巨大的性能问题。有没有人经历过这个?我这边有配置错误吗?请参阅下面的配置和 mpstat 数据:

有谁知道什么配置不正确或为什么 %sys 在核心 8、12、60、64 上如此之高?

0 投票
0 回答
50 浏览

c - dma_map_single 是否总是返回与 dma_alloc_coherent 相同的总线地址?

我有一种情况,我需要分配多个 PCIE 设备可以 DMA 进出的内存。通过一些实验,我注意到当我在一个设备上调用 dma_alloc_coherent 并在另一台设备上调用 dma_map_single 时,我最终得到了相同的总线地址。这很棒,可以大大简化我的代码,但我只是很幸运,还是保证总是如此?代码最终需要在 x86_64 和 PowerPC 上运行。无论是否有 IOMMU 硬件,它也需要工作。

这只是一些示例代码来说明我在说什么。假设 dma_alloc_coherent 和 dma_map_single 都成功,我能保证得到“得到相同地址”的打印吗?或者至少我可以用我正在使用的当前 linux 内核(5.11.12)得到这个保证?