Чаще всего драйверы размещаются в адресном пространстве
ядра системы, исполняются в высшем кольце защиты и имеют доступ для записи
к сегментам данных пользовательских программ, и, как правило, к данным
самого ядра. Это означает, что ошибка в драйвере может привести к разру-пользовательских
программ и самой ОС.
атобы избежать этого, пришлось бы выделять каждому драйверу свое адресов
пространство и обеспечивать обмен данными между драйвером, ядром и пользовательской
программой посредством статических разделяемых буферов или динамического
отображения блоков данных между разными адресными пространствами. Оба
решения приводят к значительным накладным оасходам, а второе еще и предъявляет
своеобразные требования к архитектуре диспетчера памяти (подробнее эта
проблема обсуждалась в разд. Взаимно-недоверяющие
подсистемы).
Терминальный интерфейс в Unix
На практике иногда — особенно при использовании многоуровневых драйверов
— оказывается возможным перенести отдельные функции работы с устройствами
в контекст пользовательского процесса. Одна из относительно удачных попыток
такого переноса была осуществлена в 70-е годы при разработке экранного
редактора vi, для ОС Unix (которая тогда еще была единственным представителем
того, что потом превратилось в весьма обширное семейство ОС).
По замыслу разработчиков этот редактор должен был работать с большим количеством
разных видеотерминалов, использовавших различные несовместимые системы
команд для перемещения курсора и редактирования текста в буфере терминала
и столь же несовместимые схемы кодирования специальных клавиш (стрелочек,
функциональных клавиш и пр.). Как и в примере с мышами, разные терминалы
могли подключаться к компьютеру через различные типы последовательных
портов: "токовую петлю", позднее — RS232 и др.
Как в обсуждавшемся в разд.