在使用时,其申请标志的值及含义与kmalloc()完全一样,最常用的是 GFP_KERNEL 和 GFP_ATOMIC。 /*分配多个页并返回分配内存的首地址,分配的页数为2^order,分配的页不清零。 order 允许的最大值是 10(即 1024 页)或者 11(即 2048 页),依赖于具体 的硬件平台。*/ unsigned long __get_free_pages(gfp_t ...
GFP_ATOMIC vs. GFP_KERNEL 我们都知道,在中断、软中断、spinlock等原子上下文里面,申请内存,应该使用GFP_ATOMIC标记,譬如内核中有大量的kmalloc/GFP_ATOMIC的例子: 对于不可睡眠的上下文,如果我们用常规的GFP_KERNEL这样的标记去申请内存,可能引发直接的内存reclaim,从而引起睡眠,所以GFP_KERNEL这种标记只适合进程上下文...
最一般使用的标志, GFP_KERNEL, 意思是这个分配((内部最终通过调用 __get_free_pages 来进行, 它是 GFP_ 前缀的来源) 代表运行在内核空间的进程而进行的. 换句话说, 这意味着调用函数是代表一个进程在执行一个系统调用. 使用 GFP_KENRL 意味着 kmalloc 能够使当前进程在少内存的情况下睡眠来等待一页. 一个...
而GFP_ATOMIC标记正好是用在中断处理函数中的,意思也就是说GFP_ATOMIC用在不能睡眠的场合(中断处理), 而GFP_KERNEL用在可以睡眠的场合(使用GFP_KERNEL会引起休眠)!
GFP_KERNEL:如果没有任何理由使用GFP_ATOMIC和GFP_NOIO,就是用此标志。 转自:linux kernel学习笔记-5 内存管理 1. 相关的数据结构 相比用户空间而言,在内核中分配内存往往受到更多的限制,比如内核中很多情况下不能睡眠,此外处理内存分配失败也不像用户空间那么容易。内核使用了页和区两种数据结构来管理内存: ...
GFP_KERNEL:用于内核空间的内存分配,可能休眠; GFP_ATOMIC:用于原子性的内存分配,不会休眠;典型原子性场景有中断处理程序,软中断,tasklet等 kmalloc内存分配最终总是调用__get_free_pages 来进行实际的分配,故前缀都是GFP_开头。 kmalloc分最多只能分配32个page大小的内存,每个page=4k,也就是128K大小,其中16个字节...
如果内存不够时,会等待内核释放内存,直到可以分配相应大小的内存,也就意味着会发生阻塞,因此不能使用在中断处理函数中,而GFP_ATOMIC标记正好是用在中断处理函数中的,也就是GFP_ATOMIC用在不能睡眠的场合(中断处理),而GFP_KERNEL用在可以睡眠的场合(使用GFP_KERNEL会引起休眠)!
GFP_KERNEL 内核内存的正常分配. 可能睡眠. GFP_USER 用来为用户空间页来分配内存; 它可能睡眠. GFP_HIGHUSER 如同GFP_USER, 但是从高端内存分配, 如果有. 高端内存在下一个子节描述. GFP_NOIO GFP_NOFS 这个标志功能如同 GFP_KERNEL, 但是它们增加限制到内核能做的来满足请求. 一个 GFP_NOFS 分配不允许进...
1. GFP_ATOMICvs. GFP_KERNEL 2. 内存水位,PF_MEMALLOC和GFP_ATOMIC 3. 何时使用GFP_ATOMIC(一个patch分析) GFP_ATOMICvs. GFP_KERNEL 我们都知道,在中断、软中断、spinlock等原子上下文里面,申请内存,应该使用GFP_ATOMIC标记,譬如内核中有大量的kmalloc/GFP_ATOMIC的例子: ...
char *s = kmalloc(8, GFP_KERNEL); kfree(s); kfree(s); 1.1.1 为什么调测难 在上面的例子中,宕机最后将会由用户 B 引发,从而产生的各种日志记录和 vmcore 都会把矛头指向 B。也就是说,宕机时已经是问题的第二现场了,距离内存被改的第一现场存在时间差,此时 A 可能早已销声匿迹。这时内核开发者排查...