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)
返回值:无
本文详细介绍了Linux内核中几种关键的内存分配函数,如kmalloc用于低端内存分配,要求内存大小为2的n次方且最大128k;vmalloc则在高端内存进行分配,可能涉及高端和低端内存,但物理地址不连续;另外,还涉及到__get_free_page和alloc_pages等函数用于单页或多页的分配与释放。这些函数在不同的场景下使用,满足不同内存需求和性能要求。
1581

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



