申请内存有哪些函数
linux系统中有哪些申请释放内存的函数接口了?
1、malloc函数族
首先肯定是c库函数, linux 环境下的glibc库实现名为ptmalloc的内存分配器,ptmalloc提供了malloc(),free()以及一组其它的函数供用户层内存管理。
glibc就是通过别名机制string_alias,映射了一堆c库函数(malloc/malloc.c文件中)
申请释放内存的接口有如下,其中1~3默认8字节对齐(64位系统16字节),4~8为对齐字节申请内存:
(1) void *malloc(size_t size)
在堆区分配一个长度为size的连续未初始化空间
(2) void* calloc(size_t num,size_t size)
在堆区分配num个长度为size的连续初始化为0的空间
(3) void *realloc(void *mem_address, size_t newsize)
扩大mem_address地址空间至newsize大小,并返回原mem_address地址,如果空间不够,则重新分配newsize大小空间,将原有数据拷贝至新区域,然后释放原来mem_address所指内存区域
(4) void * valloc (size_t size)
分配一个由size指定大小,地址是pagesize的倍数的内存块
(5) void *pvalloc(size_t size)
是一个废弃的函数,用法与valloc相似.如果分配失败返回NULL
(6) int posix_memalign(void **memptr, size_t alignment, size_t size)
分配size大小的字节,并将分配的内存地址存放在memptr中,分配的内存的地址将是alignment的倍数,参数alignment必须是2的幂次方
(7) void * memalign (size_t boundary, size_t size)
是一个废弃的函数,用法与posix_memalign相似,分配地址是boundary的倍数的内存块,参数boundary必须是2的幂
(8) void *aligned_alloc( size_t alignment, size_t size )
c11接口,用法与memalign函数相同,但是size大小应该alignment的倍数
(9) void free(void *ptr)
释放ptr指向的存储空间,以上所有函数申请的内存都可以用free函数释放
2、linux内核模块中动态开辟内存,不是用malloc,而是kmalloc ,vmalloc,或者用get_free_pages直接申请页
(1) void *kmalloc(size_t size, int flags)
分配的内存是物理上连续的,kmalloc最多只能开辟大小为32XPAGE_SIZE的内存,一般的PAGE_SIZE=4kB,也就是128kB的大小的内存
(2) void kfree(const void *objp)
释放kmalloc申请的内存
(3) void *vmalloc(unsigned long size)
分配的内存只是线性地址连续,物理地址不一定连续
(4) void vfree(const void *addr)
释放vmalloc申请的内存
(5) unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)
以gfp_mask的方式分配2^order个物理页面,返回指向该内存区域第一个字节的指针,不清零页面
(6) void free_pages(unsigned long addr, unsigned int order)
释放逻辑地址addr开始的页面2^order次方个