Данная глава представляет собой
обзор драйверов устройств в
системе UNIX. Устройства могут быть
либо блочного, либо символьного
типа; интерфейс между устройствами
и остальной частью ядра
определяется типом устройств.
Интерфейсом для устройств блочного
типа выступает таблица ключей
устройств ввода-вывода блоками,
состоящая из точек входа,
соответствующих процедурам
открытия и закрытия устройств и
стратегической процедуре.
Стратегическая процедура
управляет передачей данных от и к
устройству блочного типа.
Интерфейсом для устройств
символьного типа выступает таблица
ключей устройств посимвольного
ввода-вывода, которая состоит из
точек входа, соответствующих
процедурам открытия и закрытия
устройства, чтения, записи и
процедуре ioctl. Системная функция ioctl
использует при обращении к
устройствам символьного типа свой
собственный интерфейс, который
позволяет осуществлять передачу
управляющей информации между
процессами и устройствами. По
получении прерывания от устройства
ядро вызывает программу обработки
соответствующего прерывания,
опираясь на информацию, хранящуюся
в таблице векторов прерываний, и на
параметры, сообщенные устройством,
от которого поступило прерывание. Дисковые драйверы превращают
номера логических блоков,
используемые файловой системой, в
физические адреса на диске. Блочный
интерфейс дает возможность ядру
буферизовать данные.
Взаимодействие без обработки
ускоряет ввод-вывод на диск, но
игнорирует буферный кеш,
увеличивая тем самым шансы
разрушить файловую систему. Терминальные драйверы
осуществляют непосредственное
взаимодействие с пользователями.
Ядро связывает с каждым терминалом
три символьных списка, один для
неструктурированного ввода с
клавиатуры, один для ввода с
обработкой символов стирания,
удаления и возврата каретки и один
для вывода. Системная функция ioctl
дает процессам возможность следить
за тем, как ядро обрабатывает
вводимые данные, переводя терминал
в канонический режим или
устанавливая значения различных
параметров для режима без
обработки символов. Getty-процесс
открывает терминальные линии и
ждет связи: он формирует группу
процессов во главе с
регистрационным shell'ом,
инициализирует с помощью функции
ioctl параметры терминала и
обращается к пользователю с
предложением зарегистрироваться.
Установленный таким образом
операторский терминал посылает
процессам в группе сигналы в ответ
на возникновение таких событий, как
"зависание" пользователя или
нажатие им клавиши прерывания. Потоки выступают средством
повышения модульности построения
драйверов устройств и протоколов.
Поток - это полнодуплексная связь
между процессами и драйверами
устройств, которая может включать в
себя строковые интерфейсы и
протоколы для промежуточной
обработки данных. Модули потоков
характеризуются четко
определенным взаимодействием и
гибкостью, позволяющей
использовать их в сочетании с
другими модулями. Эта гибкость
имеет особое значение для сетевых
протоколов и драйверов. Предыдущая
глава || Оглавление
|| Следующая глава
10.5 ВЫВОДЫ