Linux 将多个页面作为大区域映射到进程内存空间

Linux 将多个页面作为大区域映射到进程内存空间,linux,memory-management,linux-device-driver,Linux,Memory Management,Linux Device Driver,我想知道是否有一个api可以将多个独立页面作为一个连续区域映射到一个进程内存空间中。 也就是说,我分配了两个带有alloc_页面(fags,0)的页面a和b,现在想将它们作为2*PAGESIZE大小的内存块映射到current的内存中。根据LDD3,我可以使用remap\u pfn\u range重新映射单独的页面,但是似乎没有界面来组合多个页面 将多个页面作为一个大区域映射到进程内存空间的正确方法是什么?编辑2:我对这个问题有不同的假设。 为了更好地理解,我的建议是: 用户空间进程分配内存(

我想知道是否有一个api可以将多个独立页面作为一个连续区域映射到一个进程内存空间中。 也就是说,我分配了两个带有
alloc_页面(fags,0)
的页面a和b,现在想将它们作为
2*PAGESIZE
大小的内存块映射到
current
的内存中。根据LDD3,我可以使用
remap\u pfn\u range
重新映射单独的页面,但是似乎没有界面来组合多个页面


将多个页面作为一个大区域映射到进程内存空间的正确方法是什么?

编辑2:我对这个问题有不同的假设。

为了更好地理解,我的建议是:

  • 用户空间进程分配内存(使用
    mmap
    等),将地址范围传递给内核,或在内核中使用
    vmalloc()
    分配连续的虚拟内存
  • 分配页面(…)
    以分配连续的物理页面
  • 获取分配内存范围的
    vm\u area\u struct
    (通过
    mmap
    valloc
    分配)
  • remap_pfn_range()
    将这些页面映射到分配的相邻空间的
    vm_area_结构
    。确保使用正确的
    vm\u标志
    。对于多个页面,您需要为每个页面多次调用
    remap\u pfn\u range()
    ,并且每次都需要更改
    addr
    offset输入参数
旧信息: 编辑:对不起,我忘了提这个:

请参阅:

您可以使用此选项保留连续区域。拥有
struct cma
后,可以使用
cma\u alloc()

请参阅:

这是
cma_alloc()
函数,可用于分配地址空间中的连续内存

320 /**
321  * cma_alloc() - allocate pages from contiguous area
322  * @cma:   Contiguous memory region for which the allocation is performed.
323  * @count: Requested number of pages.
324  * @align: Requested alignment of pages (in PAGE_SIZE order).
325  *
326  * This function allocates part of contiguous memory on specific
327  * contiguous memory area.
328  */
329 struct page *cma_alloc(struct cma *cma, int count, unsigned int align)

然后,您可以使用
remap\u pfn\u range()
,正如您在问题中提到的,将内存重新映射到进程的地址空间。

据我所知,这需要:a)在引导时设置一个侧连续区域(参见第204行),b)它需要内存位于物理一致的块中。我想选择将我的内存分别用作第
a
页和第
b
页,或者合并为超级页面
ab
。我根本不关心物理布局。我只需要在进程(虚拟)内存空间中连续使用它。让它在设备地址空间中连续是一个额外的好处,但这正是
pci_map_sg
的用武之地。似乎我需要比你花更长的时间浏览
cma.c
,但我的意图仍然是一样的。如果你只关心虚拟内存中的连续内存,那么你可以使用
vmalloc()
。实际上,
alloc\u页面
是否已经分配了连续页面?我可能误解了你的问题。为什么不能使用remap\u pfn\u range将两个页面重新映射到一个连续区域?我尝试创建一个池,在该池中,我有X个分配,每个分配由
alloc\u pages
(目前)返回。现在,如果用户向驱动程序请求内存,驱动程序应将请求大小的内存区域返回给用户。为此,我希望从池中获取尽可能多的allready分配的页面,直到我能够匹配大小并将这些页面映射到userprocess。这种技术可能需要将多个分配映射为一个大的分配。我希望这能在某种程度上澄清我的意图。
320 /**
321  * cma_alloc() - allocate pages from contiguous area
322  * @cma:   Contiguous memory region for which the allocation is performed.
323  * @count: Requested number of pages.
324  * @align: Requested alignment of pages (in PAGE_SIZE order).
325  *
326  * This function allocates part of contiguous memory on specific
327  * contiguous memory area.
328  */
329 struct page *cma_alloc(struct cma *cma, int count, unsigned int align)