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

What's the purpose of bypassing remapping in Thunderbolt driver?

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

确实没有理由在 Thunderbolt 驱动程序中执行此操作,因为正如您所说,Thunderbolt 设备只能“查看”IOMMU 虚拟地址中的地址space .

如果您正在为使用 真实 从 CPU 的角度来看与系统内存接口的东西编写驱动程序,您将使用未映射的地址。第 3 方开发人员没有太多机会在​​真实 Mac 上做这种事情,但是在为 VM 中的(准)虚拟化“硬件”编写驱动程序时,或者大概是在为 Hackintoshes 编写驱动程序时,有当然,您正在与不在 IOMMU“背后”的真实或虚拟设备或服务交谈的情况 - 通常,这意味着任何不在任何 PCIe 总线上的东西。

例如,I used the kIOMemoryMapperNone option to IOMemoryDescriptor:: getPhysicalSegment() 在我的 Virtio 内存气球驱动程序中。内存气球设备实际上是 VM 主机上的一些代码,它在 VM-CPU-physical 页地址上运行,所以如果虚拟机系统中有一个(虚拟化的)IOMMU,发送内存气球“映射”的物理地址不会有预期结果。