快捷搜索: 王者荣耀 脱发

用户态和内核态的内存分配

用户态内存分配 C语言中,在用户态分配内存空间可以使用malloc() ,函数原型如下:

void *malloc(size_t size); 1 参数:

size – 内存块的大小,以字节为单位。 返回值

函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。 在用户态分配的空间需要使用free() 回收。

内核态内存分配 在内核态可以使用kmalloc()、vmalloc()、kzalloc()、vzalloc()分配内存,区别如下:

void * kmalloc(size_t size, gfp_t flags) 1 参数: size_t size – how many bytes of memory are required. gfp_t flags – the type of memory to allocate.

flags 类型: GFP_KERNEL – Allocate normal kernel ram. May sleep. GFP_NOWAIT-- Allocation will not sleep. GFP_ATOMIC – Allocation will not sleep. May use emergency pools. GFP_HIGHUSER – Allocate memory from high memory on behalf of user.

kmalloc()申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因为存在较简单的转换关系,所以对申请的内存大小有限制,不能超过128KB。

void * vmalloc(unsigned long size) 1 参数: unsigned long size – allocation size 返回值: pointer to the allocated memory or NULL on error

vmalloc() 函数则会在虚拟内存空间给出一块连续的内存区,但这片连续的虚拟内存在物理内存中并不一定连续。由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小没有限制,如果需要申请较大的内存空间就需要用此函数了。

void * kzalloc(size_t size, gfp_t flags) 1 参数 size_t size – how many bytes of memory are required. gfp_t flags – the type of memory to allocate (see kmalloc).

kzalloc() 函数与 kmalloc() 非常相似,参数及返回值是一样的,可以说是前者是后者的一个变种,因为 kzalloc() 实际上只是额外附加了 __GFP_ZERO 标志。所以它除了申请内核内存外,还会对申请到的内存内容清零。

void * vzalloc(unsigned long size) 1 参数: unsigned long size – allocation size 返回值: pointer to the allocated memory or NULL on error

经验分享 程序员 微信小程序 职场和发展