Как работает пробуждение (void * chan) в xv6? - PullRequest
0 голосов
/ 24 апреля 2018

Я изучаю 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 ? Что это чан ?

1 Ответ

0 голосов
/ 26 апреля 2018

Это для процессов, которые ждут (спит) для консольного ввода. Смотрите здесь:

235 int                                                                             
236 consoleread(struct inode *ip, char *dst, int n)                                 
...                                                        
251     sleep(&input.r, &cons.lock);

Код, который вы упомянули, активирует этот спящий процесс, потому что данные поступили из консоли и теперь доступны для обработки. chan - это канал. Вы можете ждать (спать) для разных вещей. Этот канал предназначен для ввода данных с консоли.

...