Operating system 唤醒(void*chan)在xv6中是如何工作的?

Operating system 唤醒(void*chan)在xv6中是如何工作的?,operating-system,osdev,xv6,Operating System,Osdev,Xv6,我正在学习osdev并查找xv6代码,尤其是控制台代码。基本上,我不知道控制台如何启动进程 在控制台c中有一个功能: void consoleintr(int (*getc)(void)) { .... while((c = getc()) >= 0) { switch(c) { .... default: .... if(c == '\n' || c ==

我正在学习osdev并查找xv6代码,尤其是控制台代码。基本上,我不知道控制台如何启动进程

在控制台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)

然后在过程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);
}
//唤醒所有在chan上睡眠的进程。
//必须握住可折叠锁。
静态无效唤醒1(无效*chan)
{
结构程序*p;
对于(p=ptable.proc;p<&ptable.proc[NPROC];p++)
如果(p->state==SLEEPING&&p->chan==chan)
p->state=RUNNABLE;
}
//唤醒所有睡在chan身上的进程。
void唤醒(void*chan)
{
获取(&ptable.lock);
唤醒1(陈);
释放(&ptable.lock);
}

这里发生了什么?为什么要比较控制台缓冲区的地址和进程的chan?这是什么?

用于等待(休眠)控制台输入的进程。请看这里:

235 int                                                                             
236 consoleread(struct inode *ip, char *dst, int n)                                 
...                                                        
251     sleep(&input.r, &cons.lock);
您提到的代码唤醒了这个休眠进程,因为数据来自控制台,现在可以进行处理。
chan
-是一个频道。你可以等待(睡觉)不同的事情。此通道用于控制台输入数据