GFP_ATOMIC vs. GFP_KERNEL 我们都知道,在中断、软中断、spinlock等原子上下文里面,申请内存,应该使用GFP_ATOMIC标记,譬如内核中有大量的kmalloc/GFP_ATOMIC的例子: 对于不可睡眠的上下文,如果我们用常规的GFP_KERNEL这样的标记去申请内存,可能引发直接的内存reclaim,从而引起睡眠,所以GFP_KERNEL这种标记只适合进程上下文...
在使用时,其申请标志的值及含义与kmalloc()完全一样,最常用的是 GFP_KERNEL 和 GFP_ATOMIC。 /*分配多个页并返回分配内存的首地址,分配的页数为2^order,分配的页不清零。 order 允许的最大值是 10(即 1024 页)或者 11(即 2048 页),依赖于具体 的硬件平台。*/ unsigned long __get_free_pages(gfp_t ...
GFP_KERNEL: 内核内存分配的常用标志。 GFP_HIGHMEM: 从HIGH_MEM区域请求内存。 GFP_ATOMIC: 以不能休眠的原子方式分配内存。当需要从中断上下文分配内存时使用。 使用GFP_HIGHMEM时需要注意,不应该与__get_free_pages() (或者 __get_free_page())一起使用,因为HIGHMEM内存不能保证是连续的,所以不能返回从该区...
对于不可睡眠的上下文,如果我们用常规的 GFP_KERNEL 这样的标记去申请内存,可能引发直接的内存 reclaim,从而引起睡眠,所以 GFP_KERNEL 这种标记只适合进程上下文调用: GFP_KERNEL 的标记可以引发直接的内存回收,从而导致进程阻塞睡眠,这在原子上下文显然是不允许的。 #define GFP_KERNEL \(__GFP_RECLAIM | __GFP_IO...
本文补充校正一些Linux内核开发者关于GFP_ATOMIC的认知不完整的地方,阐述GFP_ATOMIC与free内存watermark的关系,并明确什么时候应该用GFP_ATOMIC申请内存。目录: 1. GFP_ATOMIC vs. GFP_KERNEL 2. 内存水位,PF_MEMALLOC和GFP_ATOMIC 3. 何时使用GFP_ATOMIC(一个patch分析) ...
GFP_ATOMIC 用来从中断处理和进程上下文之外的其他代码中分配内存. 从不睡眠. GFP_KERNEL 内核内存的正常分配. 可能睡眠. GFP_USER 用来为用户空间页来分配内存; 它可能睡眠. GFP_HIGHUSER 如同GFP_USER, 但是从高端内存分配, 如果有. 高端内存在下一个子节描述. ...
1. GFP_ATOMICvs. GFP_KERNEL 2. 内存水位,PF_MEMALLOC和GFP_ATOMIC 3. 何时使用GFP_ATOMIC(一个patch分析) GFP_ATOMICvs. GFP_KERNEL 我们都知道,在中断、软中断、spinlock等原子上下文里面,申请内存,应该使用GFP_ATOMIC标记,譬如内核中有大量的kmalloc/GFP_ATOMIC的例子: ...
如果内存不够时,会等待内核释放内存,直到可以分配相应大小的内存,也就意味着会发生阻塞,因此不能使用在中断处理函数中, 而GFP_ATOMIC标记正好是用在中断处理函数中的,意思也就是说GFP_ATOMIC用在不能睡眠的场合(中断处理), 而GFP_KERNEL用在可以睡眠的场合(使用GFP_KERNEL会引起休眠)!
linux内核中的两个标记GFP_KERNEL和GFP_ATOMIC是用来干什么的?,1.作用用来标记分配内核空间内存时的方式2.两个标记使用在什么场合?如果内存不够时,会等待内核释放内存,直到可以分配相应大小的内存,也就意味着会发生阻塞,因此不能使用在中断处理函数中,而GFP_ATOMIC标
在linux/gfp.h中定义的一个宏,是分配内核空间的内存时的一个标志位。这个标志位分配内存的一个选项,GFP_KERNEL是内核内存分配时最常用的,无内存可用时可引起休眠。《Linux就该这么学》这本书推荐给你,帮助你更好的全方面了解linux,希望能帮到你。