可以通过kmalloc(,GFP_KERNEL)分配失败吗?

时间:2014-11-23 16:19:40

标签: linux

我是Linux内核领域的新手,我有这些(愚蠢)的问题,请帮我正确理解

  1. 正如我在Linux设备驱动程序上读到的那样,它说(使用GFP_KERNEL)
  2.   

    当前进程休眠时,内核会采取适当的操作来定位一些进程   通过将缓冲区刷新到磁盘或通过从内存交换内存来释放内存   用户流程。

    所以(也许)如果内核在执行了上述所有操作后仍然没有足够的内存来满足分配,那么当前进程是否还必须等待它?是否有任何情况下当前进程必须永远等待足够的内存进行分配(我的意思是其他设备,不仅仅是计算机)?

    1. 正如我所读到的,GFP_ATOMIC在进程的上下文之外使用""。所以我想这组词的含义是,如果我有一个正常的过程A正在运行

      process A 
      {
      command 1; 
      command 2;
      .....;
      }
      
    2. 然后我有一个使用GFP_ATOMIC

      的中断处理程序B.
          interrupt handler B
          {
          command 1;
          command 2;
          ......;
          kmalloc ( , GFP_ATOMIC);
          ......;
          }
      

      所以我的当前进程A仍然在没有睡眠的情况下运行,直到它完成并且中断处理程序B中的分配是否成功,中断处理程序B不会影响我的进程A.这是真的吗?

      非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

kmalloc(,GFP_KERNEL)不能永远等待,除非您添加可选标志__GFP_NOFAIL。请注意,在最近的内核上不推荐使用这个。

GFP_ATOMIC仅在原子上下文中使用:这意味着禁用抢占,或禁用中断或在中断上下文(ISR)中。一个简单的规则:只要您有权睡觉,最好使用GFP_KERNEL,否则,您必须使用GFP_ATOMIC。

希望有所帮助。 Aymen。