关闭

常见内存分配函数

标签: 内存分配kmallocvmallockzallocmalloc
44人阅读 评论(0) 收藏 举报
分类:

常见内存分配函数


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[n],每一个指针指向小块内存的首地址

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:47次
    • 积分:10
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档
    阅读排行
    评论排行