kmalloc函数的原型是:
- #include <linux/slab.h>
- void *kmalloc(size_t size, int flags);
******size是要分配的块大小
******flags分配方式,控制kmalloc分配内存的方式
******在没有阻塞的情况下,分配内存快,并且对于分配到的内存块,不对该内存块清零,分配到的内存块里保存着原来它存储的内容.
******kmalloc分配到的内存块是连续的物理内存.
kmalloc的分配标志解读(这些标志在<linux/gfp.h>头文件中)
1. GFP_KERNEL
******最一般的使用分配标志,代表运行在内核空间的进程而进行的内存分配.
******当所请求分配的内存不够一页的时候,GFP_KERNEL让当前进程睡眠,来等待够一页内存大小的时候,才能获得正确分配到的内存.
******使用GFP_KERNEL的函数必须是可重入的函数,并且不能在原子上下文中运行.
(可重入函数:简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误)
(上下文的概念:对于一个进程,执行过的部分称为进程的上文,正在执行的部分称为进程的正文,还没执行性进程的下文)
(原子操作:通俗滴说就是从开始到最后的运行完成,中间不能被打断)
******GFP_KERNEL分配标志,不能用在中断处理函数中,tasklet (在某些方面类似内核定时器),内核定时器中.
2. GFP_ATOMIC
******用来从中断处理和进程上下文之外的其他代码中分配内存,从不睡眠.
3. GFP_USER
******为用户空间页来分配内存,可能睡眠.
4. GFP_DMA
cp:http://blog.csdn.net/wzc18743083828/article/details/18547831