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

时间:2015-01-16 13:49:42

标签: linux memory-management linux-device-driver

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

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

1 个答案:

答案 0 :(得分:2)

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

通过更好的理解,我的建议只是:

  • 用户空间进程分配内存(使用mmap等),将地址范围传递给内核或在内核中使用vmalloc()来分配连续的虚拟内存。
  • alloc_pages(...)分配连续的实体页面
  • 获取已分配内存范围的vm_area_struct(通过mmapvalloc分配)
  • remap_pfn_range()将这些页面映射到已分配的连续空间vm_area_struct。请务必使用正确的vm_flags。对于多个页面,您需要为每个页面多次调用remap_pfn_range(),并且每次都需要更改addr偏移量输入参数。

旧信息:

编辑:抱歉,我忘记提及:

请参阅:http://lxr.free-electrons.com/source/mm/cma.c#L212

194 /**
195  * cma_declare_contiguous() - reserve custom contiguous area
196  * @base: Base address of the reserved area optional, use 0 for any
197  * @size: Size of the reserved area (in bytes),
198  * @limit: End address of the reserved memory (optional, 0 for any).
199  * @alignment: Alignment for the CMA area, should be power of 2 or zero
200  * @order_per_bit: Order of pages represented by one bit on bitmap.
201  * @fixed: hint about where to place the reserved area
202  * @res_cma: Pointer to store the created cma region.
203  *
204  * This function reserves memory from early allocator. It should be
205  * called by arch specific code once the early allocator (memblock or bootmem)
206  * has been activated and all other subsystems have already allocated/reserved
207  * memory. This function allows to create custom reserved areas.
208  *
209  * If @fixed is true, reserve contiguous area at exactly @base.  If false,
210  * reserve in range from @base to @limit.
211  */
212 int __init cma_declare_contiguous(phys_addr_t base,
213                         phys_addr_t size, phys_addr_t limit,
214                         phys_addr_t alignment, unsigned int order_per_bit,
215                         bool fixed, struct cma **res_cma)

您可以使用它来保留连续区域。获得struct cma后,您可以使用cma_alloc()

请参阅:http://lxr.free-electrons.com/source/mm/cma.c#L329

这是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_pfn_range()将内存重新映射到进程的地址空间。