我的问题只是好奇,我不是MacOS Thunderbolt驱动程序的开发人员,所以我没有这方面的经验
我在MacOS上看到了这个关于霹雳驱动程序和IOMMU的页面。据我所知,当驱动程序请求内存地址时,获得的地址不是物理地址,而是IOMMU映射的虚拟地址。我认为这是由于在没有IOMMU的情况下使用DMA存在安全风险。但是,驱动程序也有一些绕过重映射的选项,例如,在mappingOptions
设置为kBypassed
的情况下调用IODMACommand
对象的initWithSpecification
方法。然而,在页面中,据说调用这样的方法来获得未映射的物理地址并将其用于DMA将破坏驱动程序
所以我的问题是:在霹雳驱动程序中,如果无法将未映射的物理地址用于DMA,那么请求该地址的目的是什么
很抱歉,如果这个问题看起来很愚蠢,但正如我所说,我没有这类东西的经验,我只是很好奇。
在Thunderbolt驱动程序中真的没有理由这样做,因为正如你所说的;参见";IOMMU的虚拟地址空间中的地址。
如果您从CPU的角度为使用真实物理地址与系统内存接口的东西编写驱动程序,那么您将使用未映射的地址。对于第三方开发人员来说,在真正的Mac上做这种事情的机会不多,但当为(para-(虚拟化的";硬件";在虚拟机中,或者可能在为Hackintoshe编写驱动程序时,肯定会有这样的情况,即你正在与一个不是";在"后面";IOMMU-通常,这意味着任何不在任何PCIe总线上的东西。
例如,我在Virtio内存气球的驱动程序中使用了kIOMemoryMapperNone
选项来IOMemoryDescriptor:: getPhysicalSegment()
。内存气球设备实际上是VM主机上的一些代码,它在VM CPU物理页面地址上运行,所以如果虚拟机系统中有一个(虚拟化的(IOMMU,则发送内存气球";映射的";物理地址将不会有预期的结果。