- 论坛徽章:
- 0
|
第9章. 中断里调用哪些函数是安全的?
内核中许多函数会导致睡眠(亦即,直接或间接地调用了scheduler()):当持有锁或禁止了抢占时,你不可以调用它们。这同样意味着只有在用户上下文才可以调用:在中断里调用它们是非法的。
9.1. 一些可能睡眠的函数
下面列出了最常见的几个,但通常来讲,你需要阅读代码来判断其它的函数是否可以在中断里安全的调用。如果每一个人都是在可睡眠环境下调用某个函数的,那么多半你也要保证可睡眠的环境(译者案:原文是“If everyone else who calls it can sleep, you probably need to be able to sleep, too.”) 特别地,注册与注销函数通常需要在用户上下文中调用,它们可能睡眠。
*
访问用户空间:
o
copy_from_user()
o
copy_to_user()
o
get_user()
o
put_user()
*
kmalloc(GFP_KERNEL)
*
down_interruptible() 和 down()
有一个down_trylock()函数,它可以在中断上下文中调用,不会睡眠。Up()决不会导致睡眠。
9.2. 一些不会睡眠的函数
有些函数可以在任何上下文中调用,可以持有任何的锁。
*
printk()
*
kfree()
*
add_timer() 和 del_timer() |
|