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)
返回值:无