Драйвер управляет устройством - настраивает, отправляет команды, обрабатывает прерывания и общается с процессами, которые ожидают завершения ввода-вывода. Код драйвера зависит от конкретного устройства, поэтому изучайте документацию на устройство, чтобы понять код драйвера.
Устройство прерывает процессор, когда требует внимания. Обработчик прерывания опознает устройство и вызовет процедуру драйвера. В xv6 это делает процедура devintr
.
Файл kernel/console.c
содержит код драйвера терминала. Драйвер обрабатывает символы из последовательного порта UART на RISC-V, которые человек вводит на клавиатуре.
QEMU эмулирует микросхему 16550 UART и подключает клавиатуру и экран к UART. На реальном компьютере 16550
управляет портом RS232
, который работает с терминалом или другим компьютером.
Драйвер накапливает символы в кольцевом буфере cons.buf
. Индекс cons.r
указывает на первый символ, который прочтет функция consoleread
. Буфер хранит строки символов, а индекс cons.w
указывает на начало последней строки, которую еще вводит человек. Индекс cons.e
указывает позицию курсора в последней строке для ввода следующего символа.