MacOS PCI dext:将 DMA 分散聚集到应用程序缓冲区

MacOS PCI dext: scatter-gather DMA to application buffer

我正在将使用 IOKit 编写的 MacOS PCI 驱动程序移植到新的 PCIDriverKit 框架。

我能够使用在 dext 中分配的连续缓冲区执行 DMA(IOBufferMemoryDescriptor::Create)。

但我也想对应用程序分配的缓冲区执行 DMA。

我真正想做的是:

在 IOKit 中,我们可以使用 IOMemoryDescriptor::withAddressRangeIODMACommand::gen64IOVMSegments 等方法来映射和检索分散收集列表,但我找不到任何关于如何在 dext 中使用 PCIDriverKit 框架执行此操作的信息.

任何人都可以帮助我如何做到这一点?

这与您的问题并不完全相同,但是 in my answer 我详细介绍了 DriverKit 扩展中的内存描述符。

基本上,在 DriverKit 中,您只能访问明确提供为缓冲区的用户 space 内存;您不能将任意数据解释为用户进程地址中的指针 space 并为它们创建内存描述符。

据我所知,为用户 space 缓冲区创建内存描述符的唯一方法是通过 IOUserClient 外部方法的“结构”参数,即当用户进程将它们传递给IOConnectCallMethod* 作为输入或输出“结构”的函数族。如果缓冲区大于 4096 字节,它将在 dext 中显示为 IOMemoryDescriptor,您可以用它执行通常的 DMA 操作。

通常,您需要结合异步外部方法来执行此操作,这可以让您实现合理的缓冲区生存期语义,但您的 dext 在技术上可以保留用户 space 提供的内存描述符超过 return 同步外部方法,或超过异步方法的异步完成。