本帖最后由 spongebooob 于 2011-04-09 11:30 编辑 up()中: 首先递增sem->count,如果递增结果小于或等于0时就调用__wake_up唤醒一个进程。 问题是判断的为什么是“小于等于0”而不是“等于0”?因为这时如果sem->count小于0,被唤醒的进程也是不能进入临界区的:在__down()中81行被唤醒,再到74行时sem->sleepers为1,sleepers-1为0,通过atomic_add_negtive加到sem->count后还是小于0,继续到81行schedule()中睡眠!这次调用...
驱动中需要写一个唤醒函数,类似wake_up。自己写的原因主要是__wake_up_common这段有点不适合 list_for_each_safe(tmp, next, &q->task_list) { wait_queue_t *curr = list_entry(tmp, wait_queue_t, task_list); unsigned flags = curr->flags; if (curr->func(curr, mode, sync, key) && (flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive) break; } 因为等待队列加...