在linux内核开发中断处理函数不能调用可能导致睡眠的函数,下面总结linux内核可能引起睡眠的函数如下:

schedule函数

  1. schedule_timeout
  2. schedule_timeout_uninterruptible
  3. schedule_timeout_interruptible
  4. cond_resched
  5. might_resched

sleep函数

  1. msleep
  2. msleep_interruputible
  3. ssleep
  4. osal_usleep
  5. might_sleep

取信号量函数

  1. down
  2. down_timeout
  3. down_read
  4. down_write
  5. down_interruptible
  6. wait_for_completion
  7. wait_for_completion_interruptible
  8. wait_for_completion_timeout
  9. wait_for_completion_interruptible_timeout

kmalloc相关函数含有标志GFP_KERNEL

  1. kmalloc
  2. kzalloc
  3. krealloc
  4. kmem_cache_create
  5. kmem_cache_alloc
  6. kmem_cache_zalloc

取睡眠锁函数

  1. mutex_lock
  2. mutex_lock_timeout
  3. mutex_lock_nested
  4. mutex_lock_interruptible
  5. mutex_lock_interruptible_nested

在中断处理函数不能使用睡眠函数原因

主要原因如下:

  1. 中断是一种紧急事务,中断处理函数要求快
  2. linux是以进程为调度单位的,调度器只看到进程内核栈,而看不到中断栈,在独立中断栈的模式下,如果linux内核在中断处理函数内发生了调度或者睡眠,导致无法找到回家的路,未执行的中断处理代码再也无法获得执行机会(贪睡开小差是有代价哦)