分配内存-vmalloc

内存分配函数vmalloc,它是用来分配虚拟地址空间的连续区域的。尽管这段区域在物理上可能是不连续的(要访问其中的每个页面都必须独立调用函数alloc_page),内核却认为它们在地址上是连续的。vmalloc在发送错误时返回0(NULL地址),成功时返回一个指针,该指针指向一个线性的、大小最小为SIZE的线性内存区域。

vmalloc相关的内容定义在<linux/vmalloc.h>中。

vmalloc是Linux内存分配机制的基础。但是,在大多数情况下,不鼓励使用vmalloc。通过vmalloc获得的内存使用起来效率不高,而且在某些系统架构上,用于vmalloc的地址空间总量相对较小。如果可能,应该直接和单个页面打交道,而不是使用vmalloc。

主要的API:

void *vmalloc(unsigned long size);
void vfree(const void *addr);

其实,由kmalloc和__get_free_pages返回的内存地址也虚拟地址,其实际值任然要有MMU(内存管理单元,通常是CPU的组成部分)处理才能转为物理内存地址。vmalloc在如何使用硬件上没有区别,区别在于内核如何执行分配任务上。

kmalloc和__get_free_pages使用的(虚拟)地址范围与物理内存是一一对应的,可能会有基于常量PAGE_OFFSET的一个偏移。这两个函数不需要为该地址段修改页表。但,vmalloc使用的地址范围完全是虚拟的,每次分配都要通过也页表的适当设置来建立(虚拟)内存区域。

用vmalloc分配得到的地址是不能给微处理器之外使用的,因为它们只在处理器的内存管理单元上才有意义。当驱动程序需要真正的物理地址时(像外设用以驱动系统总线的DMA地址),就不能使用vmalloc了。使用vmalloc函数的正确场合是在分屏一大块连续的,只在软件中存在的、用于缓冲的内存区域的时候。注意,vmalloc的开销要比__get_free_pages大,因为它不但获取内存,还要建立页表。因此,用vmalloc函数分配仅仅一页的内存空间是不值得的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值