Раздел 6. Ввод-вывод и файловая система
Тема 17. Ввод-вывод
Принципы программного обеспечения ввода-вывода
1. Независимость от устройств. Этот принцип означает возможность написания программ, способных получать доступ к любому устройству ввода-вывода без предварительного указания конкретного устройства.
2. Единообразное именование. Имя файла или устройства должно быть просто текстовой строкой или целым числом и никоим образом не зависеть от физического устройства.
Способы осуществления ввода-вывода
Существует три различных способа осуществления операций ввода-вывода.
Программный ввод-вывод. Например, если нужно напечатать на принтере строку символов, операционная система сначала копирует данные в ядро. Затем ОС входит в цикл, в котором на каждой итерации цикла печатает на принтере один символ. После печати каждого символа процессор в цикле опрашивает готовность устройства. Такое поведение процессора называется опросом, или активным ожиданием. Программный ввод-вывод легко реализуется, но его недостаток состоит в том, что центральный процессор занимается на все время операции ввода-вывода.
Управляемый прерываниями ввод-вывод. Когда выполняется системный вызов печати строки, буфер копируется в пространство ядра и первый символ строки копируется на принтер. После этого центральный процессор вызывает планировщик, который запускает какой-либо другой процесс. Процесс, попросивший распечатать строку, оказывается заблокирован на весь период печати строки. Когда принтер напечатал символ и готов принять следующий, он инициирует прерывание. Это прерывание вызывает остановку текущего процесса и сохранение его состояния. Затем запускается процедура обработки прерывания от принтера.
Ввод-вывод с использованием прямого доступа к памяти (DMA, Direct Memory Access). Очевидный недостаток управляемого прерываниями ввода-вывода состоит в том, что прерывания происходят при печати каждого символа. Обработка прерываний занимает определенное время, поэтому такая схема не является эффективной. Решение этой проблемы заключается в использовании DMA. Контроллер DMA поставляет принтеру символы по одному, не беспокоя при этом центральный процессор. По существу, этот метод почти не отличается от программного ввода-вывода, с той лишь разницей, что всю работу вместо центрального процессора выполняет контроллер DMA. Наибольший выигрыш от использования DMA состоит в уменьшении количества прерываний с одного на печатаемый символ до одного на печатаемый буфер.
Программные уровни ввода-вывода
Программное обеспечение ввода-вывода обычно организуется в виде четырех уровней, показанных на рис. 17.1. У каждого уровня есть свои функции и строго определенный интерфейс с соседними уровнями.
Обработчики прерываний
Когда происходит прерывание, начинает работу обработчик прерываний. По окончании необходимой работы он может разблокировать драйвер, запустивший его. Ниже перечислены основные действия, выполняемые программным обеспечением после того, как произошло аппаратное прерывание.
1. Сохранить все регистры, не сохраненные аппаратурой.
2. Установить контекст для процедуры обработки прерываний. Выполнение этого действия может включать установку TLB и таблицы страниц.
3. Установить указатель стека для процедуры обработки прерываний.
4. Выдать подтверждение контроллеру прерываний. Если централизованного контроллера прерываний нет, разрешить прерывания.
5. Скопировать содержимое регистров в таблицу процессов.
6. Запустить процедуру обработки прерываний. Она извлечет информацию из регистров контроллера устройства, инициировавшего прерывание.
7. Выбрать процесс, которому передать управление.
8. Установить контекст блока управления памятью для следующего работающего процесса.
9. Загрузить регистры нового процесса.
10. Начать выполнение нового процесса.
Драйверы устройств
У каждого контроллера есть набор регистров, используемых для того, чтобы давать управляемому им устройству команды и читать состояние устройства. Команды, выдаваемые устройствам, зависят от конкретного устройства. Поэтому для управления каждым устройством ввода-вывода требуется специальная программа. Эта программа, называемая драйвером устройства, обычно пишется производителем устройства. Для каждой операционной системы требуются специальные драйверы. Каждый драйвер устройства обычно поддерживает один тип устройств или класс близких устройств.
Чтобы получить доступ к регистрам контроллера, драйвер устройства должен быть частью ядра ОС. Драйверы устройств обычно располагаются под остальной частью операционной системы.
ОС обычно классифицирует драйверы по нескольким категориям в соответствии с типами обслуживаемых ими устройств. К наиболее общим категориям относятся блочные устройства, например, диски, содержащие блоки данных, к которым возможна независимая адресация, и символьные устройства, такие как клавиатуры и принтеры, формирующие или принимающие поток символов.
В ОС определен стандартный интерфейс, поддерживаемый всеми драйверами. Эти интерфейсы включают набор процедур, которые могут вызываться из остальной операционной системы для обращения к драйверу.
У драйвера устройства есть несколько функций.
1. Обработка абстрактных запросов чтения и записи независимого от устройства программного обеспечения, расположенного над ним.
2. Проверка входных параметров.
3. Преобразование абстрактных параметров в конкретные. Например, дисковый драйвер может преобразовывать линейный номер блока в номера головки, дорожки и сектора.
4. Проверка готовности и незанятости устройства.
5. Собственно управление устройством. Выдача ему серии команд.
6. Во многих случаях драйвер устройства должен ждать, пока контроллер не выполнит для него определенную работу, поэтому он блокируется до тех пор, пока прерывание от устройства его не разблокирует. В других случаях операция завершается без задержек и драйверу не нужно блокироваться.
7. По завершении выполнения операции драйвер должен проверить, выполнилась ли операция без ошибок. Если все в порядке, драйвер передает данные независимому от устройств программному обеспечению.