IOMMU

优质
小牛编辑
131浏览
2023-12-01
IOMMU

IOMMU非常类似于MMU,主要有如下功能:(1)IO地址转换[在64位系统上支持32位设备];(2)分散-聚集(scatter-gather)支持[简化驱动程序的编写];(3)DMA重映射与IRQ重映射[简化了IO设备的虚拟化]。
Linux内核当前的DMA映射有如下4种具体实现:
(1)在内存不足3G的机器上,根本不使用任何IOMMU功能,因为根本没必要。内核消息:"PCI-DMA: Disabling IOMMU"
(2)基于GART(CONFIG_GART_IOMMU)的硬件IOMMU。内核消息:"PCI-DMA: using GART IOMMU"
(3)如果内存大于3G同时机器上又没有IOMMU硬件(或者用了"iommu=soft"),那么就使用软件模拟的 IOMMU(CONFIG_BOUNCE)。内核消息:"PCI-DMA: Using software bounce buffering for IO (SWIOTLB)"
(4)基于IBM Calgary硬件的IOMMU,仅用于IBM pSeries/xSeries系列服务器。内核消息:"PCI-DMA: Using Calgary IOMMU"

[IOMMU]
iommu={off,force,noforce,soft}
通用IOMMU设置:
off 彻底关闭IOMMU功能
force 强制使用硬件IOMMU,即使硬件可能有缺陷(例如VIA芯片组)或者根本没有必要这样做(例如内存不足3G)。
noforce(默认) 在内存不足3G的机器上,不使用硬件IOMMU,因为根本没有必要。
soft(Intel平台的默认值) 使用通过软件模拟的IOMMU(SWIOTLB),同时禁止使用硬件IOMMU(即使存在)。
[IOMMU]
iommu=[SIZE][,allowed][,fullflush|nofullflush][,leak[=NUM]][,memaper[=N]|noaperture][,noagp][,merge|nomerge][,forcesac][,panic][,allowdac|nodac][,calgary]
仅适用于硬件IOMMU(GART与Calgary)的设置:
SIZE 重映射区域的大小,单位是字节。
allowed 含义与"force"相同,即使硬件可能有缺陷(例如VIA芯片组)也强制使用硬件IOMMU
fullflush(默认) 每次分配时都刷新IOMMU
nofullflush 不刷新IOMMU
leak=NUM 开启IOMMU泄漏跟踪(CONFIG_IOMMU_LEAK),NUM是的泄漏页数(默认值是20)。
memaper=N 在RAM中分配的固有窗口(own aperture)的大小,算法是 2N*32MB,N的默认值是"1",也就是64MB。
noaperture 禁止IOMMU使用AGP的"aperture"。
noagp 不初始化AGP驱动,使用完全的"aperture"。
merge 强制"scatter-gather"合并,隐含了"force",这是一个实验性选项。
nomerge 禁止"scatter-gather"合并
forcesac 对于少于40位的掩码强制使用单地址周期(single-address cycle),这是一个实验性选项。
panic 当IOMMU益处时,允许panic
allowdac 将32位PCI地址用两个时钟周期推入64位地址,这就是DAC的作用。
nodac 禁用DAC,也就是所有4GB以上的DMA将强制通过IOMMU(硬件的或模拟的)
calgary 使用IBM Calgary IOMMU
swiotlb=页数[,force]
仅适用于软件IOMMU(CONFIG_BOUNCE)的设置:
页数 为"IO bounce buffer"预先保留的页数,每个页的大小是128K
force 强制所有IO都透过软件IOMMU
[AMD-IOMMU]
amd_iommu={fullflush|off|force_isolation}
向AMD IOMMU驱动(CONFIG_AMD_IOMMU)传递选项
fullflush 表示当IO/TLB项被取消映射的时候立即刷新IO/TLB项(严格模式,速度较慢),否则将仅在IO/TLB项被重用之前进行刷新(宽松模式,速度更快)
off 表示彻底禁用AMD IOMMU功能
force_isolation 表示为所有设备强制启用IOMMU隔离(映射),这样IOMMU驱动就不再需要自己去发起隔离请求。注意:此选项不会覆盖"iommu=pt"
[Intel-IOMMU]
intel_iommu={on,off,igfx_off,forcedac,strict,sp_off}
Intel-IOMMU驱动(CONFIG_INTEL_IOMMU)的主要功能就是DMA重映射,该选项用于设置其特性。
on 开启Intel-IOMMU驱动
off 关闭Intel-IOMMU驱动
igfx_off 关闭Intel集成显卡的DMA重映射功能(默认值为开启)
forcedac 强制PCI设备使用DAC,而禁止进行地址转换(默认值为允许)
strict 禁止批量刷写IOTLB(默认值为允许)
sp_off 关闭super page支持(默认值为开启)
[Intel-IOMMU]
intremap={on,off,nosid,no_x2apic_optout}
设置中断重映射功能:
on(默认值)开启中断重映射
off 关闭中断重映射
nosid 重映射时不对SID(Source ID)做检查
no_x2apic_optout 无视BIOS的设置,强制禁用x2APIC特性,主要用于解决某些对x2APIC支持有缺陷的BIOS导致的故障