The Linux Kernel Module Programming Guide笔记
时间:2009-03-21 来源:wxju168
if (xxx_major){ if (result <0){ printk(KERN_WARNING "xxx: can't get major %d\n", xxx_major); return result; } |
static void xxx_setup_cdev(struct xxx_dev *dev, int index) |
DECLARE_MUTEX(name);//一个称为name的信号量被初始化为1 |
P函数称为down:
void down(struct semaphore *sem);//down减少信号量的值,并在必要时一直等待 int down_trylock(struct semaphore *sem);//down_trylock不会休眠,如果信号量在调用时不可获得,会立即返回一个非零值 |
V函数称为up:
void up(struct semaphore *sem); |
spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED; |
void spin_lock(spinlock_t *lock);//自旋锁的等待本质上不可中断,一旦调用spin_lock,在获得锁之前将一直处于自旋状态 |
void spin_unlock(spinlock_t *lock); |
适用自旋锁的核心规则是:任何拥有自旋锁的代码都必须是原子的,它不能休眠。事实上,它不能因为任何原因放弃处理器,除了服务中断以外(某些情况下此时也不能放弃处理器)。任何时候,只要内核代码拥有自旋锁,在相关的处理器上的抢占就会被禁止。自旋锁必须在可能的最短时间内拥有。
17、休眠
永远不要在原子上下文中进入休眠。这意味着:我们的驱动程序不能在拥有自旋锁、seqlock或者RCU锁时休眠;如果我们已经禁止了中断,也不能休眠。同时我们对唤醒之后的状态不能做任何假定,因此必须检查以确保我们的等待的条件真正为真。
初始化一个等待队列头:
DECLARE_WAIT_QUEUE_HEAD(name); |
wait_event(queue, condition);//进程将被置于非中断休眠,通常不是我们所期望的。 |
void wake_up(wait_queue_head_t *queue); |
DECLARE_WAITQUEUE(wait, current); |
//申请irq |
/*tasklet使用模板*/ |
/*工作队列*/
|
struct timer_list { |
/*定时器使用模板*/
|