Linux 将多个页面作为大区域映射到进程内存空间
我想知道是否有一个api可以将多个独立页面作为一个连续区域映射到一个进程内存空间中。 也就是说,我分配了两个带有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:我对这个问题有不同的假设。 为了更好地理解,我的建议是: 用户空间进程分配内存(
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()
offset输入参数addr
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)