linux 内存函数

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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操作
在这里插入图片描述

内存管理经典函数

  1. get_user_pages —将用户态内存锁定,例如mlock 会锁定内存
  2. follow_page —根据vm address 查找 page
  3. vm_normal_page -----赶回nomal页面的page, special页面(如vm_io/vm_pfnmap/vm_dontexpand)等区间内存
  4. remap_pfn_range/vm_insert_page/vm_insert_pfn 映射内核页面到用户空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值