您的位置:首页 > 其它

常见内存分配函数

2016-08-30 20:08 232 查看

常见内存分配函数

1 . kmalloc 内核函数

#include <linux/slab.h>
void *kmalloc(size_t size, int flags);//最大为 128k
void kfree(void *ptr);


kmalloc分配一块物理空间和虚拟空间都连续,大小为size的内存。

常用的flags标志有:

GFP_ATOMIC

用来从中断处理和进程上下文之外的其他代码中分配内存. 从不睡眠.

GFP_KERNEL

内核内存的正常分配. 可能睡眠.最常用的,(内部最终调用 __get_free_pages)

GFP_USER

用来为用户空间页来分配内存; 它可能睡眠.

例如: P=(int*)kmalloc(n*sizeof(int),GFP_KERNEL);//返回值是一个指向内存开始的指针

2 . kzalloc 内核函数

#include <linux/slab.h>
void *kzalloc(size_t size, gfp_t flags);
void kfree(void *ptr);


用kzalloc申请内存的时候,效果相当于先是用 kmalloc()申请空间,然后用 memset(0) 来初始化。

参数参考kmalloc();

3 . vmalloc 内核函数

#include <linux/vmalloc.h>
void *vmalloc(unsigned long size);
void vfree(void * addr);


vmalloc 在虚拟内存空间分配一块较大的连续内存区(虚拟内存空间连续,物理内存不一定连续)

函数可能引起睡眠,中断中最好不采用该函数分配内存。

4 . __get_free_page 内核函数

#include <linux/gfp.h>
__get_free_page(unsigned long int gfp_mask);//(内部调用 __get_free_pages)


申请一块物理和虚拟内存都连续的内存。

5 . malloc 用户空间函数

#include <stdlib.h>
void *malloc(size_t size);//单位 bytes
void free(void *ptr);


malloc是动态分配一块连续的内存,malloc()的参数是一个指定所需字节数的整数,

内存没有被初始化。

例如:P=(int*)malloc(n*sizeof(int));//返回值是一个指向内存开始的指针

6 . calloc 用户空间函数

#include <linux/slab.h>
void *calloc(size_t nmemb, size_t size);//单位 bytes
void free(void *ptr);


calloc和malloc使用相似,主要的区别是分配内存初始化默认值为0。

colloc需要两个参数,第一个是需要分配内存的变量的个数,第二个是每个变量的大小.

例如:P=(int*)calloc(n,sizeof(int));

//返回值是一个数组指针,p[1]~p
,每一个指针指向小块内存的首地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息