Linux内存管理(4) - 不连续页的分配vmalloc

本文详细解析Linux内核中的vmalloc函数,用于在虚拟内存中分配不连续但在物理内存中可能不连续的大块内存。vmalloc以页为单位分配内存,适用于需要大量内存但无法保证物理连续性的场景,如模块加载。文章介绍了vmalloc的实现过程,包括构造vm_struct结构,使用__get_vm_area_node和__vmalloc_area_node进行内存分配,以及虚拟地址到物理地址的映射机制,特别是32位系统中的四级页表结构。
摘要由CSDN通过智能技术生成

本文目的在于分析Linux内核中的vmalloc函数。内核版本为2.6.31。

我们知道物理上连续的映射对内核是最好的,但不是总能成功。在分配一大块内存时,可能无法找到连续的内存块。在用户空间这不是问题,因为普通进程设计为使用处理器的分页机制,当然这会降低速度并占用TLB。

在内核中也可以使用同样的技术,典型的例子为vmalloc()。

vmalloc是一个接口函数,内核代码用它来分配在虚拟内存中连续但在物理内存中不一定连续的内存。

void *vmalloc(unsigned longsize);

该函数只需要一个参数,用于指定所需内存的长度,单位为字节。但是要注意,vmalloc是以页大小为单位分配内存的。

使用vmalloc最著名的实例的内核对模块的实现,因为模块可能在任何时候加载,如果模块数据较多,那么无法保证有足够的连续内存可用。如果可以用小块内存拼接出足够的内存,使用vmalloc便可以规避该问题。

因为用于vmalloc的内存页总是映射在内核地址空间中,因此使用ZONE_HIGHMEM内存域的页要优于其他内存域。如果内核没有高端内存域,则实际上是使用的NORMAL内存域,只是使用了页表。

内核在管理虚拟内存中的vmalloc区域时,由于内存是分散的,必须跟踪哪些子区域被使用、哪些是空闲的。为此定义了一个数据结构struct vm_struct,将所有使用的部分保存在一个链表中。

vmalloc()直接调用了__vmalloc_node()函数:


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值