Linux kernel mmap能否在linux驱动程序中处理非连续页面范围?

Linux kernel mmap能否在linux驱动程序中处理非连续页面范围?,linux-kernel,linux-device-driver,dma,Linux Kernel,Linux Device Driver,Dma,我希望能够将单个用户空间地址映射到多个低内核内存块。我有一个驱动程序,使用pci_alloc_consistent()分配多个4MB块。理想情况下,我希望用户空间进程将8MB(即24MB块)视为映射到其虚拟地址空间的单个缓冲区。这在mmmap()中可能吗?或者,有没有一种方法可以使用pci_alloc_consistent()或其他API分配大于4MB的内核内存块(只要内存与dma兼容) 如果有人给我指点,我将不胜感激。 谢谢。查看mm/memory.c中的函数vm\u insert\u pag

我希望能够将单个用户空间地址映射到多个低内核内存块。我有一个驱动程序,使用pci_alloc_consistent()分配多个4MB块。理想情况下,我希望用户空间进程将8MB(即24MB块)视为映射到其虚拟地址空间的单个缓冲区。这在mmmap()中可能吗?或者,有没有一种方法可以使用pci_alloc_consistent()或其他API分配大于4MB的内核内存块(只要内存与dma兼容)

如果有人给我指点,我将不胜感激。
谢谢。

查看mm/memory.c中的函数
vm\u insert\u page()
remap\u pfn\u range()

您可以在以下位置找到一个示例:drivers/media/v4l2 core/videobuf2 dma sg.c,function
vb2\u dma\u sg\u mmap()

我仍然不确定如何实现这一点。在我看来,我不能使用remap_pfn_range(),因为我必须通过pci_alloc_consistent()单独分配缓冲区。也就是说,我正在处理两个不同的虚拟/物理地址。vm_insert_page()似乎可以工作,但前提是我对通过pci_alloc_consistent()分配的内存的每个页面块调用get_page()。否则,只有第一页与vm_insert_page()一起使用。我不太确定结果是什么(每个缓冲区调用1280次以获取页面()。
vm\u insert\u page()
插入一个页面,因此必须对缓冲区中的每个页面执行此操作。这就是VB2 DMA sg所做的。您应该使用
virt\u to\u page()
从虚拟地址检索
页面。Internallu,
vm\u insert\u page()
将执行
get\u page()
以增加引用计数器昨天我查看vb2\u dma\u sg()时,它似乎完全符合我的要求。但是,我并没有太注意.pages[]是如何创建的。在我的例子中,vm_insert_page()失败,因为除了第一个缓冲区外,page_count()在给定缓冲区的所有页面上返回0。这就是为什么我需要调用get_page()。谢谢你的指点。我仍在尝试评估这种方法的成本。我需要180MB的缓冲区(46080页条目)。您是否发现该方法存在任何潜在问题?如果需要
mmap
180MB,请映射180MB。任何其他机制都是最糟糕的,因为您需要
mmap
功能