内核空间分配内存 kmalloc和vmalloc 及 页式分配

kmallck分配低端内存(3G+896M以内),最大128k,必须是2的n次方,因为底层是基于__get_free_pages实现的,虚拟地址空间连续,物理地址空间也连续,即虚拟地址 = 3G + 物理地址。kzalloc = kmalloc + memset(,0,)分配内存并清0

void *kmalloc(size_t size, gfp_t gfp)

size:内存大小的 字节数,最大128k且必须是2的n次方

gfp:内存分配标志

                GFP_KERNEL:内核可能被休眠,用于进程上下文

                GFP_ATOMIC:处理紧急事务,用在中断上下文

返回值:对应虚拟内存首地址

释放内存

void kfree(const void *addr)

addr:分配的虚拟内存首地址

返回值:无

vmalloc从高端内存(低端内存+120M以内)处开始分配,得到的有可能是高端内存也有可能是低端内存,虚拟地址空间连续,物理地址空间不一定连续,分配的页必须一个一个的映射,效率不高,只在为获得大块内存时使用

void *vmalloc(unsigned long size)

size:内存大小的 字节数

返回值:对应虚拟内存首地址

释放内存

void vfree(const void *addr)

addr:分配的虚拟内存首地址

返回值:无

分配一个页的内存,PAGE_SIZE字节,一般是4096个字节=4KB

unsigned long __get_free_page(gfp_t gfp)

gfp:内存分配旗标

                GFP_KERNEL:内核可能被休眠,用于进程上下文

                GFP_ATOMIC:处理紧急事务,用在中断上下文

返回值:分配的页的地址的编号,如0xffff880124470000,失败=0

释放一个页的内存

void free_page(unsigned long addr)

addr:分配的页的地址的编号,如0xffff880124470000

返回值:无

分配多个页的内存, 调用了alloc_pages( )函数

unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)

gfp_mask:内存分配旗标

                GFP_KERNEL:内核可能被休眠,用于进程上下文

                GFP_ATOMIC:处理紧急事务,用在中断上下文

order:要申请2的多少次方 个连续物理页,有最大值限制10或11,值越大分配失败几率越高,使用时通常小于5,即小于32个页。可用get_order(4*1024)函数省去计算,注意get_order(4*1024)中的参数是字节数,即若需要4KB的内存,填入4*1024=4096字节

返回值:分配的第一个页的地址的编号,如0xffff880124470000,失败=0

释放多个页的内存

void free_pages(unsigned long addr, unsigned long order)

addr:分配的第一个页的地址的编号,如0xffff880124470000

order:之前申请的2的多少次方个连续物理页,get_order(4*1024)

返回值:无

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值