【发布时间】:2020-08-19 06:10:46
【问题描述】:
我不明白为什么从键盘中断得到的输入又被写回io总线:
这是键盘中断处理程序:
void consoleintr(int (*getc)(void)) {
// I skipped some code for simplicity
default:
if(c != 0 && input.e-input.r < INPUT_BUF){
c = (c == '\r') ? '\n' : c;
input.buf[input.e++ % INPUT_BUF] = c;
-----> consputc(c);
if(c == '\n' || c == C('D') || input.e == input.r+INPUT_BUF){
input.w = input.e;
wakeup(&input.r);
}
}
break;
}
}
输入c 取自getc 函数并写入input.buf 环形缓冲区,然后立即传递给consputc 函数。
consputc 函数调用uartputc,后者调用outb(COM1+0, c)。
uartgetc 函数也注册为consoleintr 函数的输入:
static int uartgetc(void) {
if (!uart) {
return -1;
}
if (!(inb(COM1 + 5) & 0x01)) {
return -1;
}
return inb(COM1+0);
}
void uartintr(void) {
consoleintr(uartgetc);
}
代码链接:
【问题讨论】:
标签: unix operating-system xv6