GFP_ATOMIC(在 kzalloc 中)如何防止睡眠?
还发现
#define GFP_ATOMIC (__GFP_HIGH)
但是没有进一步了解..?
GFP_ATOMIC(在 kzalloc 中)如何防止睡眠?
还发现
#define GFP_ATOMIC (__GFP_HIGH)
但是没有进一步了解..?
的替代方案GFP_ATOMIC
是GFP_KERNEL
:
#define GFP_KERNEL (__GFP_WAIT | __GFP_IO | __GFP_FS)
。
GFP_KERNEL
incldes __GFP_WAIT
,在考虑睡眠的各种情况下进行测试。没有这面旗帜,就没有睡眠。
如果您尝试在 linux 内核中分配内存,则可以借助名为 kmalloc(size,flags) 的函数来完成。但是函数中的标志参数基本上是指示内核应该如何分配内存。基本上有三个区域的标志作为动作修饰符,区域修饰符和类型。
如果您将标志指定为GFP_ATOMIC,则分配是高优先级的并且不会休眠。这是在中断处理程序、下半部分和其他无法睡眠的情况下使用的标志。
&它基本上是指示内核从预先分配的slab内存中获取内存块,如果slab中有内存,那么它是原子分配的,否则分配失败。
GFP_ATOMIC
通过告诉内存分配代码不允许睡眠来满足分配来防止睡眠 - 仅此而已。如果内存分配代码需要休眠,并且GFP_ATOMIC
已经通过,那么它将向调用者返回一个错误。