Я изучаю osdev и ищу код xv6, в настоящее время - в частности, код консоли. По сути, я не понимаю, как консоль запускает процесс.
в console.c есть функция:
void consoleintr(int (*getc)(void)) {
....
while((c = getc()) >= 0) {
switch(c) {
....
default:
....
if(c == '\n' || c == C('D') || input.rightmost == input.r + INPUT_BUF) {
wakeup(&input.r);
}
}
}
Итак, я понял, что когда строка заканчивается (или длина буфера превышает максимальную), она запускает wakeup (& input.r)
Тогда есть это в proc.c :
// Wake up all processes sleeping on chan.
// The ptable lock must be held.
static void wakeup1(void *chan)
{
struct proc *p;
for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
if(p->state == SLEEPING && p->chan == chan)
p->state = RUNNABLE;
}
// Wake up all processes sleeping on chan.
void wakeup(void *chan)
{
acquire(&ptable.lock);
wakeup1(chan);
release(&ptable.lock);
}
Что здесь происходит? Почему сравнивается адрес консольного буфера и proc chan ? Что это чан ?