Почему ввод с клавиатуры записывается обратно на шину ввода-вывода в xv6? - PullRequest
0 голосов
/ 04 мая 2020

Я не понимаю, почему ввод, полученный от прерывания клавиатуры, снова записывается на шину 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);
}

Ссылки на код:

  1. consoleintr: https://github.com/mit-pdos/xv6-public/blob/master/console.c#L192

  2. расход c: https://github.com/mit-pdos/xv6-public/blob/master/console.c#L166

  3. uartput c: https://github.com/mit-pdos/xv6-public/blob/master/uart.c#L52

1 Ответ

1 голос
/ 05 мая 2020

Клавиша, нажатая с клавиатуры, не пересылается для повторной обработки, но отправляется на вывод:

UART - это своего рода последовательная линия, она используется двумя способами: ввод и вывод.

Клавиатура только в устройстве ввода.

Когда вы нажимаете клавишу, нажатая клавиша будет отправлена ​​на последовательный выход.

Небольшая схема может объяснить лучше:

+-------------+                                   
|             |                                   +--------------+
| Keyboard    +-----+                       +---->+ Screen (term)|
|             |     |                       |     +--------------+
+-------------+     |    +------------+     |     
                    |    |            |     |      +----------------+
                    +--->| Char to    +-----+----->+ Input (process)|----> ....
                    |    |   process  |     |      +----------------+   
+--------------+    |    +------------+     |     +--------------+
|              |    |                       +---->+ Serial: out  |
| Serial: in   +----+                             |  outb(...)   |
|  inb(...)    |                                  +--------------+
+--------------+

...