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 映射内核页面到用户空间
本文介绍了Linux内核中的`copy_to_user`函数用于从内核复制数据到用户空间,以及`vmalloc`函数用于在高端内存区分配连续虚拟地址但非连续物理地址的内存。此外,还探讨了内存管理的一些经典函数,如`get_user_pages`用于锁定用户态内存,`follow_page`查找页面,以及`vm_normal_page`、`remap_pfn_range`等用于映射和管理内存的机制。
2万+

被折叠的 条评论
为什么被折叠?



