说明:该驱动和前一篇文章“Linux字符驱动中动态分配设备号与动态生成设备节点”中的效果是相同的(见 ),只不过这里使用了信号量对globalvar_write 和 globalvar_read函数进行了阻塞控制,当上层应用程序写入驱动改变globalvar之后,读操作才可以进行。
上面代码为什么会出现死锁呢,可以查阅内核中的up()函数的定义:
/* /kernel/semaphore.c */
void up(struct semaphore *sem)
{
unsigned long flags;
spin_lock_irqsave(&sem->lock, flags);
if (likely(list_empty(&sem->wait_list)))
sem->count++;
else
__up(sem);
spin_unlock_irqrestore(&sem->lock, flags);
}
static noinline void __sched __up(struct semaphore *sem)
{
struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list,
struct semaphore_waiter, list);
list_del(&waiter->list);
waiter->up = 1;
wake_up_process(waiter->task);
}