问题标签 [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 投票
2 回答
12049 浏览

iommu - 查找 iommu 组的设备

我正在使用适用于 linux 的 IOMMU API,我想获取属于已知组 ID 的特定组的特定设备。

iommu_group 结构有一个设备列表字段,但不可访问。有没有办法得到它?

0 投票
1 回答
802 浏览

c - Linux 4.4 PCIe DMA 进入用户空间页面不起作用 - highmem 不能用于 DMA?

我正在更新一个较旧的 linux 驱动程序,该驱动程序通过 DMA 将数据传输到用户空间页面,这些页面通过get_user_pages().

我的硬件是一个新的基于 x86 Xeon 的主板,具有 12GB 的 RAM。

驱动程序将数据从 VME 获取到 PCIe FPGA,并且应该将其写入主存储器。我dma_map_pages()为每一页做一个,我检查它dma_mapping_error()并将返回的物理 DMA 地址写入 DMA 控制器的缓冲区描述符。然后我启动 DMA。(我们还可以在 FPGA 跟踪器中看到传输开始)。

但是,当我得到 DMA 完成 IRQ 时,我看不到任何数据。对于控制,我可以通过 PIO 模式访问相同的 VME 地址空间,并且可以正常工作。我还尝试将值写入用户页面的 page_address(page) 并且应用程序可以看到这些。一切都好。

深入研究这个问题,我检查了像 DMA-API.txt 这样的常用文档,但我找不到任何其他方法,在其他驱动程序中也找不到。

我的内核是一个自编译的 4.4.59 64 位,各种调试(调试 DMA-API 等)设置为是。

我还尝试通过驱动程序/iommu/ 来查看这里的调试可能性,但那里只有一些 pr_debugs。

有趣的是:我有另一个驱动程序,一个以太网驱动程序,它支持连接到 PCI 的 NIC。这个工作没有问题!

在转储和比较检索到的 DMA 时dma_addr_t,我看到了这一点:

NIC 驱动程序通过dma_alloc_coherent()缓冲区描述符等分配内存,它的地址在“lower 4 GB”中:

VME 驱动程序,dma_map_page'ing 用户空间页面大于 4GB,DMA 地址看起来不同:0xffffe010(与应用程序有偏移)。

DMA_BIT_MASK(32)在两个驱动程序中都设置了,我们的 FPGA 内核是 32 位宽的。

问题:我是否必须具备特殊的先决条件才能使此 DMA 工作?我读到 highmem 内存不能用于 DMA,现在还是这样吗?

dmesg 的一部分:

0 投票
1 回答
1002 浏览

virtual-machine - GPU 直通后没有主机显示

我正在尝试设置 GPU 直通以在我的系统上的 VM 中使用。我正在使用 Ubuntu 17.04 并在手动将 nouveau 驱动程序列入黑名单后成功按照以下链接中的说明进行操作。

https://medium.com/@calerogers/gpu-virtualization-with-kvm-qemu-63ca98a6a172

当我打开主机系统时,我看到 Ubuntu 启动启动画面,但随后屏幕变黑并且没有显示任何内容。我可以通过 ssh 进入系统并看到 Nvidia GPU 已正确分配给 vfio-pci(如预期的那样)。我还没有测试过直通在 VM 上是否有效,因为我想让我的主机显卡首先与集成的 Intel 显卡一起工作。

我试过xrandr,但它说它无法打开显示器。我希望我必须做一些特定的事情来为主机启用集成显卡。有什么建议么?

系统:华擎 Z77 EXTREME4 Intel i7-4790K Nvidia GTX 650 Ti

谢谢您的帮助!

0 投票
1 回答
45917 浏览

linux - 检查 linux 上的 IOMMU 支持

我想在任何给定的 Linux 机器上验证是否支持 PCI 直通。经过一番谷歌搜索,我发现我宁愿检查是否支持 IOMMU,我通过运行:

如果它支持 IOMMU(而不是 IOMMUv2),我会得到:

...DMAR: IOMMU enabled我要找的东西在哪里。

现在,如果机器已经运行了好几天而没有重新启动,那么第一条消息[ 0.000000] DMAR: IOMMU enabled 可能不会再使用上一个命令出现在日志中。

当该消息从日志中消失时,有什么方法可以检查 IOMMU 支持吗?

0 投票
0 回答
77 浏览

linux-kernel - 总线层次结构中的地址转换

考虑一个总线层次结构,它包括与另一条总线 B 连接的总线 A。总线 B 连接其他两条总线 C 和 D。ab、bc 和 bd 是相应的桥。此外,这些总线中的每一个都连接了它们的设备。

我了解根据总线的应用,它可能具有其速度和地址范围容量。我想专注于这些总线中的每一个的地址空间。由于 A 是所有总线下层级的主机,它的地址范围应该足够宽以唯一地确定层级中的每个设备。

  1. 我的理解是,一般来说,总线 C 上的设备可能与总线 D 上的设备在数字上具有相同(或重叠)的总线本地地址范围。然而,当这些地址范围被映射到总线上层总线B时,它们被映射为两个不同的地址范围。这意味着设备 Cc 可能已分配本地地址范围 0x000 - 0xfff,设备 Dd 也具有相同的本地地址范围 0x000 - 0xfff,但在总线 B 上,它们可能映射到类似 Cc (0x0000-0x0fff) 和 Dd 为 (0xaaaa - 0xeb3f)。虽然这是映射实际上非常特定于一个平台,但想了解这种理解总体上是否正确。

  2. 我一直假设的另一点是,当数据在任一方向交叉时,桥会执行地址转换的功能。请让我知道这是否正确。

  3. 我的另一个问题是如果桥执行此翻译,桥填充翻译表时?桥接控制器驱动程序有什么作用吗?它是如何做到的(如果有的话)?

0 投票
3 回答
29611 浏览

linux - 检查是否在 BIOS/UEFI 中启用了 VT-D / IOMMU

要检查是否在 BIOS/UEFI 中启用了 Intel 的 VT-X 或 AMD 的 AMD-V,我使用:

我找不到检查 BIOS/UEFI 中是否启用了 Intel 的 VT-D 或 AMD 的 IOMMU 的方法。

我需要一种方法来检测它是否已启用,而无需设置 iommu 内核参数(iommu=1、、、amd_iommu=onintel_iommu=on

我的一个想法是使用rdmsr,但我不确定这是否可行。而不是systool我最初想使用sudo rdmsr 0x3A,但它对我不起作用。它总是报告:

rdmsrmsr-tools顺便说一句的一部分。并且要使用需要msr先加载 kenel 模块(sudo modprobe msr)。

据称sudo rdmsr 0x3A应该已经返回35表明 VT-X/AMD-V 已启用...

0 投票
1 回答
5949 浏览

linux - 检查主板/BIOS/UEFI和CPU是否支持VT-D/IOMMU

我发现我可以使用以下代码确定是否启用了 VT-D / IOMMU:

但是在没有启用它的情况下,我无法找到一种方法来检查系统是否首先支持该选项。

我知道 Intel/AMD 已经记录了他们的哪些 CPU 支持 VT-D / IOMMU,但我想知道整个系统(主板+UEFI/BIOS+CPU+芯片组)是否支持此功能,因为我的笔记本例如有一个支持它的 CPU,但 UEFI 中没有启用它的选项。

0 投票
1 回答
243 浏览

x86 - INTEL VT-D 根表和上下文表关系

我正在尝试了解 INTEL VT-D,我读过根表有 256 个条目,每个根表都指向更深的上下文表,每个表有 256 个条目,其中每个上下文表都包含二级翻译。不幸的是,我无法弄清楚根表和上下文表之间的确切关系。我们有 256 * 256 个上下文表条目吗?或者每个根表都指向同一个上下文表。通过查看下图,在此处输入图像描述 它说每个上下文表都有不同的总线号,但我无法与之关联,如果有人告诉我二级翻译也很好,我熟悉 MMU 分页但 VT-D 分页是真的很混乱。我已经浏览了 VT-D 规格,但仍然有一些概念不清楚,我在上面描述过。

0 投票
1 回答
334 浏览

linux-kernel - 在 x86 平台上,IOMMU 是否默认翻译了 PCI 事务中的地址?

我知道 PCI 具有称为 ATS 的功能,可以将虚拟地址转换为物理地址,但我不确定当前 x86 平台是否默认启用它。

如果是,我应该如何在Linux系统中生成虚拟地址和对应的页表?

这就是我现在的猜测。首先,像 pci_map_* 这样的 DMA API 将调用 intel iommu 驱动程序来设置页表并获取 io 虚拟地址。其次,PCI 设备将使用该虚拟 io 地址开始事务,vt-d 将该虚拟 io 地址转换为物理地址。我说得对吗?

0 投票
0 回答
612 浏览

linux-device-driver - 如何将我的设备与 IOMMU 框架连接?

我在我的 linux 驱动程序中添加了 IOMMU 支持,并注意到 IOMMU 组在引导期间分配给了设备:

[0.942274] iommu:将设备 0000:03:00.0 添加到组 28

虽然,当我尝试iommu_attach_device()进入驱动程序时,它失败了。我发现它在调用iommu_group_get()我的设备时失败了。

如何为我的设备获取分配的组并在我的驱动程序中使用它?
我正在使用 Ubuntu 4.15.0-45-generic 内核。

编辑:
iommu_group_get()struct device字段iommu_group未初始化时失败。另外,我在启动后手动加载驱动程序。

Edit2: 我确实看到该设备已添加到 dmesg 输出中的第 28 组。我的驱动程序探测例程中有以下序列,这是通过引用现有内核驱动程序源获得的:

我已经调用 IOCTL 来固定用户空间虚拟地址 ( get_user_pages_fast) 并执行iommu_map. 这对于使用用户空间区域为设备启用 DMA 是否有效?