Intel IOMMU on Linux kernel

本文介绍了Linux内核中Intel IOMMU的支持情况,包括DMAR(DMA重映射)、DRHD(DMA引擎报告结构)、RMRR(预留内存区域报告结构)等关键概念。内容涵盖了IO虚拟地址(IOVA)的生成、图形设备问题的处理以及故障报告机制。通过ACPI枚举平台上的DMA引擎和设备范围,解释了如何为不同设备设置DMA翻译。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux IOMMU Support
===================

The architecture spec can be obtained from the below location.

http://www.intel.com/technology/virtualization/

This guide gives a quick cheat sheet for some basic understanding.

Some Keywords

DMAR - DMA remapping
DRHD - DMA Engine Reporting Structure
RMRR - Reserved memory Region Reporting Structure
ZLR  - Zero length reads from PCI devices
IOVA - IO Virtual address.

Basic stuff
-----------

ACPI enumerates and lists the different DMA engines in the platform, and
device scope relationships between PCI devices and which DMA engine  controls
them.

What is RMRR?
-------------

There are some devices the BIOS controls, for e.g USB devices to perform
PS2 emulation. The regions of memory used for these devices are marked
reserved in the e820 map. When we turn on DMA translation, DMA to those
regions will fail. Hence B
<think>我们正在回答用户的问题:如何在Linux系统中启用IOMMU功能(特别是为了支持设备直通,如GPU直通) 根据引用[1][2][3]的内容,我们知道: - IOMMU(Input-Output Memory Management Unit)是一种硬件功能,用于管理设备对内存的访问,提高安全性和支持设备直通(如GPU直通)。 - 在x86-64架构上,Intel平台使用Intel IOMMU(VT-d),AMD平台使用AMD-Vi(IOMMU)。 - 在arm64架构上,也有对应的IOMMU硬件。 - 启用硬件IOMMU后,通常会禁用软件实现的SWIOTLB(因为硬件IOMMU效率更高)。 用户可能的需求是启用IOMMU以进行设备直通(如GPU直通),因此我们需要根据不同的硬件平台(Intel/AMD/ARM)给出启用方法。 步骤: 1. 确认CPU和主板支持IOMMU(VT-d/AMD-Vi)。 2. 在BIOS/UEFI中开启IOMMU功能(不同主板设置不同)。 3. 在Linux内核启动参数中启用IOMMU。 4. 验证IOMMU是否启用成功。 下面详细说明:</think>### 在Linux系统中启用IOMMU的完整指南 IOMMU(Input-Output Memory Management Unit)是硬件辅助的虚拟化技术,用于设备直通(如GPU直通)。启用流程因硬件平台而异: --- #### 一、确认硬件支持 1. **Intel平台(VT-d)** ```bash grep -E "vmx|svm" /proc/cpuinfo # 确认CPU支持虚拟化 dmesg | grep -i DMAR # 检查VT-d支持 ``` 输出需包含`DMAR: IOMMU enabled`[^2] 2. **AMD平台(AMD-Vi)** ```bash dmesg | grep -i AMD-Vi # 检查AMD-Vi支持 ``` 3. **ARM平台(SMMU)** ```bash dmesg | grep -i smmu # ARM架构检查 ``` --- #### 二、BIOS/UEFI启用 | 平台 | BIOS设置项 | |------------|-----------------------------| | Intel | Advanced > VT-d > **Enabled** | | AMD | Advanced > IOMMU > **Enabled** | | ARM服务器 | Advanced > SMMU > **Enabled** | > ⚠️ 不同主板路径可能为:`Chipset > South Bridge` 或 `Security Settings` --- #### 三、Linux内核配置 1. **修改GRUB配置** ```bash sudo nano /etc/default/grub ``` - **Intel平台**: ```ini GRUB_CMDLINE_LINUX="... intel_iommu=on iommu=pt" ``` - **AMD平台**: ```ini GRUB_CMDLINE_LINUX="... amd_iommu=on iommu=pt" ``` - **ARM平台**: ```ini GRUB_CMDLINE_LINUX="... iommu.passthrough=1" ``` 2. **更新引导配置** ```bash sudo update-grub # Ubuntu/Debian sudo grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS ``` 3. **重启系统** ```bash sudo reboot ``` --- #### 四、验证启用状态 1. **检查内核日志** ```bash dmesg | grep -i IOMMU ``` **成功输出示例**: ``` DMAR: IOMMU enabled AMD-Vi: IOMMU performance counters supported ``` 2. **查看IOMMU分组** ```bash sudo lspci -vvv # 查看设备Capabilities ls /sys/kernel/iommu_groups/ # 确认分组存在 ``` 3. **验证设备直通能力** ```bash sudo dmesg | grep -e DMAR -e AMD-Vi -e SMMU ``` 输出应包含`IOMMU enabled`或`Enabled IRQ remapping`[^1][^2] --- #### 五、技术原理 1. **IOMMU作用** $$ \text{设备DMA地址} \xrightarrow{\text{IOMMU转换}} \text{物理内存地址} $$ - 隔离设备内存访问 - 支持32位设备访问>4G内存[^3] - 替代低效的SWIOTLB[^3] 2. **工作流程** ```mermaid graph LR A[设备发起DMA] --> B(IOMMU拦截请求) B --> C{地址转换?} C -->|是| D[转换地址并放行] C -->|否| E[触发Page Fault] ``` --- #### 六、故障排除 1. **IOMMU未启用** - 确认BIOS设置已保存 - 检查`/proc/cmdline`确认参数生效 2. **设备未分组** ```bash echo 1 | sudo tee /sys/bus/pci/rescan # 重新扫描PCI设备 ``` 3. **嵌套虚拟化问题** 在VMware/KVM中启用嵌套虚拟化: ```bash sudo modprobe -r kvm_intel sudo modprobe kvm_intel nested=1 ``` --- ### 相关问题 1. 如何为特定PCI设备禁用IOMMU保护? 2. IOMMU启用后为何SWIOTLB被自动禁用?[^3] 3. 如何在ARM架构下验证SMMU的实际性能? 4. IOMMU与SR-IOV技术如何协同工作? 5. 启用IOMMU后出现系统不稳定应如何调试?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值