MacOS PCI dext:将 DMA 分散聚集到应用程序缓冲区
MacOS PCI dext: scatter-gather DMA to application buffer
我正在将使用 IOKit 编写的 MacOS PCI 驱动程序移植到新的 PCIDriverKit 框架。
我能够使用在 dext 中分配的连续缓冲区执行 DMA(IOBufferMemoryDescriptor::Create
)。
但我也想对应用程序分配的缓冲区执行 DMA。
我真正想做的是:
- 在应用程序中分配一个对齐的缓冲区(例如
posix_memalign
)
- 将指向此缓冲区的指针发送到 dext
- 在 dext 中,检索页面描述符列表,以便能够执行 DMA 而无需复制到(或从)该缓冲区。
在 IOKit 中,我们可以使用 IOMemoryDescriptor::withAddressRange
和 IODMACommand::gen64IOVMSegments
等方法来映射和检索分散收集列表,但我找不到任何关于如何在 dext 中使用 PCIDriverKit 框架执行此操作的信息.
任何人都可以帮助我如何做到这一点?
这与您的问题并不完全相同,但是 in my answer 我详细介绍了 DriverKit 扩展中的内存描述符。
基本上,在 DriverKit 中,您只能访问明确提供为缓冲区的用户 space 内存;您不能将任意数据解释为用户进程地址中的指针 space 并为它们创建内存描述符。
据我所知,为用户 space 缓冲区创建内存描述符的唯一方法是通过 IOUserClient
外部方法的“结构”参数,即当用户进程将它们传递给IOConnectCallMethod*
作为输入或输出“结构”的函数族。如果缓冲区大于 4096 字节,它将在 dext 中显示为 IOMemoryDescriptor
,您可以用它执行通常的 DMA 操作。
通常,您需要结合异步外部方法来执行此操作,这可以让您实现合理的缓冲区生存期语义,但您的 dext 在技术上可以保留用户 space 提供的内存描述符超过 return 同步外部方法,或超过异步方法的异步完成。
我正在将使用 IOKit 编写的 MacOS PCI 驱动程序移植到新的 PCIDriverKit 框架。
我能够使用在 dext 中分配的连续缓冲区执行 DMA(IOBufferMemoryDescriptor::Create
)。
但我也想对应用程序分配的缓冲区执行 DMA。
我真正想做的是:
- 在应用程序中分配一个对齐的缓冲区(例如
posix_memalign
) - 将指向此缓冲区的指针发送到 dext
- 在 dext 中,检索页面描述符列表,以便能够执行 DMA 而无需复制到(或从)该缓冲区。
在 IOKit 中,我们可以使用 IOMemoryDescriptor::withAddressRange
和 IODMACommand::gen64IOVMSegments
等方法来映射和检索分散收集列表,但我找不到任何关于如何在 dext 中使用 PCIDriverKit 框架执行此操作的信息.
任何人都可以帮助我如何做到这一点?
这与您的问题并不完全相同,但是 in my answer 我详细介绍了 DriverKit 扩展中的内存描述符。
基本上,在 DriverKit 中,您只能访问明确提供为缓冲区的用户 space 内存;您不能将任意数据解释为用户进程地址中的指针 space 并为它们创建内存描述符。
据我所知,为用户 space 缓冲区创建内存描述符的唯一方法是通过 IOUserClient
外部方法的“结构”参数,即当用户进程将它们传递给IOConnectCallMethod*
作为输入或输出“结构”的函数族。如果缓冲区大于 4096 字节,它将在 dext 中显示为 IOMemoryDescriptor
,您可以用它执行通常的 DMA 操作。
通常,您需要结合异步外部方法来执行此操作,这可以让您实现合理的缓冲区生存期语义,但您的 dext 在技术上可以保留用户 space 提供的内存描述符超过 return 同步外部方法,或超过异步方法的异步完成。