1

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

4

1 回答 1

1

在 Thunderbolt 驱动程序中确实没有理由这样做,因为正如您所说,Thunderbolt 设备只能“看到”IOMMU 的虚拟地址空间中的地址。

从 CPU 的角度来看,如果您正在为使用真实物理地址与系统内存接口的东西编写驱动程序,那么您将使用未映射的地址。对于第 3 方开发人员来说,在真正的 Mac 上做这种事情的机会并不多,但是在为 VM 中的(半)虚拟化“硬件”编写驱动程序时,或者可能是在为 Hackintoshes 编写驱动程序时,肯定会有你'正在与不在 IOMMU“后面”的真实或虚拟设备或服务交谈——通常,这意味着任何不在任何 PCIe 总线上的东西。

例如,我在驱动程序中使用了 Virtio 内存气球的kIOMemoryMapperNone选项IOMemoryDescriptor:: getPhysicalSegment()。内存气球设备实际上是 VM 主机上的一些代码,它在 VM-CPU-物理页面地址上运行,因此如果虚拟机系统中有(虚拟化)IOMMU,则发送内存气球“映射”物理地址不会有预期的结果。

于 2020-09-26T10:57:55.137 回答