申请内存有哪些函数

linux系统中有哪些申请释放内存的函数接口了?

 

1malloc函数族

首先肯定是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次方个

 

posted @ 2023-01-08 10:36  ho966  阅读(240)  评论(0编辑  收藏  举报