2020-05-23
关键字:kmalloc、kzalloc、kcalloc
1、kmalloc()
kmalloc() 是Linux内核开发中最常使用的申请内存的函数。它的原型如下所示:
#include
void *kmalloc(size_t size, int flags);
函数的返回值通常就指向所申请到的内存空间的起始地址。当然,有时它也会指向 NULL--如果内存的申请出于某些原因失败的话。
参数 1 表示要申请的空间大小,单位是字节。size_t 其实就是个 unsigned int 的别名。
参数 2 表示申请内存时的模式。这个模式有很多个可选类型,它们均声明于 中。虽然在 gfp.h 中有众多可选类型,但其实最常用的也就两个值:
1、GFP_KERNEL
这个标志表示当内核中的可用内存不足时,调用者,即发起当前申请请求的进程将会被强制进入休眠状态以等待有足够的内存可供申请为止。也正因为这个标志有可能导致调用进程的休眠,这个标志只被允许在“进程上下文”中使用。“中断上下文”如果要休眠的话是会引发错误的。
2、GFP_ATOMIC
内核会额外地将一部分内存划分出来以专供于原子性的空间申请使用。简单来说,使用这个标志就是有内存时就给你分配,没有就直接以失败告终,它不会让你的进程进入休眠态的。
需要注意的是:以上的头文件贴出的仅仅是标准Linux内核中的声明。不同版本、用途的Linux内核可能会有不同的声明结构,这些需要各位同学自行确认。
以下是一个使用 kmalloc() 函数申请内存的小实例:
structPerson{char *name;intage;
};int__ini