copy_to_user
__arch_copy_to_user
vmalloc
从高端内存区highmem分配内存,虚拟内存地址是连续的,但是物理地址不是连续的
void *vmalloc(unsigned long size)
for (i = 0; i < area->nr_pages; i++) {
struct page *page;
if (node == NUMA_NO_NODE)
page = **alloc_page**(alloc_mask|highmem_mask);
else
page = alloc_pages_node(node, alloc_mask|highmem_mask, 0);
if (unlikely(!page)) {
/* Successfully allocated i pages, free them in __vunmap() */
area->nr_pages = i;
goto fail;
}
area->pages[i] = page;
if (gfpflags_allow_blocking(gfp_mask|highmem_mask))
cond_resched();
}
if (**map_vm_area**(area, prot, pages))
goto fail;
return area->addr;
如何分配内存:
__vmalloc_area_node -> alloc_page
-> map_vm_area
会从高端内存区进行alloc_page操作
内存管理经典函数
- get_user_pages —将用户态内存锁定,例如mlock 会锁定内存
- follow_page —根据vm address 查找 page
- vm_normal_page -----赶回nomal页面的page, special页面(如vm_io/vm_pfnmap/vm_dontexpand)等区间内存
- remap_pfn_range/vm_insert_page/vm_insert_pfn 映射内核页面到用户空间