在读代码学习的时候发现有个malloc函数用的很奇怪,跳到定义处查看了一下原理来时一个宏定义。
/* use volatile to fix a probable compiler error on 2.6.25 */
#define malloc(_size, type, flags) \
({ volatile int _v = _size; kmalloc(_v, GFP_ATOMIC | __GFP_ZERO); }) ,
前面的时候发现调用的时候很奇怪的参数,这里竟然没有使用 na = malloc(len, M_DEVBUF, M_NOWAIT | M_ZERO);
kmalloc的原型是:
void *kmalloc(size_t size, int flags);
这里使用kmalloc除了是在内核驱动进行编程外,一个重要的原因就是这里的驱动程序要使用DMA,而kmalloc分配的内存在物理上是连续的。
这里的第二个参数比较有趣,flags有比较多的选项,这里只讲这里用到的这两个
GFP_ATOMIC用来从中断处理和进程上下文之外的其他代码中分配内存. 从不睡眠.