我想知道是否有一个api将多个单独的页面映射为进程内存空间中的一个连续区域。
即我用alloc_pages(fags, 0)
分配了两个页面a和b,现在想要将它们作为大小为2*PAGESIZE
的内存块映射到current
的内存中。根据LDD3,我可以使用remap_pfn_range
重新映射单独的页面,但是似乎没有可以组合多个页面的界面。
将多个页面作为一个larege区域映射到进程内存空间的正确方法是什么?
答案 0 :(得分:2)
编辑2:我对这个问题有不同的假设。
通过更好的理解,我的建议只是:
mmap
等),将地址范围传递给内核或在内核中使用vmalloc()
来分配连续的虚拟内存。alloc_pages(...)
分配连续的实体页面vm_area_struct
(通过mmap
或valloc
分配)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()
将内存重新映射到进程的地址空间。