Принципы программной реализации управления вводом-выводом.
В основу программной реализации управления вводом-выводом положены следующие основные принципы:
1. Независимость от устройств – возможность разработки пользовательской программы без предварительного указания конкретного типа устройства, например чтение и запись данных должны выполняться по одной (сходной команде для GMD, CDR, магнитных дисков.. ) для этого ОС должна определять как настроить программу обращения к физическому внешнему устройству в соответствии с запросом пользователя.
2. Единообразное именование – имя устройства, к которому происходит обращение должно быть текстовой строкой (логическое имя).
3. Обработка ошибок – ошибки должны обрабатываться в первую очередь аппаратурой с возможностью повторения сбойной операции. Если нижний уровень не может исправить ошибку, диагностическая информация передается верхнему уровню обработчика ошибок. Возможно повторение операции выполнить с помощью программной организации.
4. Перенос данных – как правило должен быть определен способ передачи данных: синхронный(блокирующий) или асинхронный(по прерыванию):
- асинхронный – перенос данных осуществляется без использования ЦП, по окончании переноса данных – прерывание(окончание операции)
- синхронный – после операции ввода-вывода пользовательский процесс блокируется пока данные не окажутся в буфере процесса
5. Использование буферизации – для считывания и записи информации во внешние устройства должны использоваться временные(промежуточные) буферы между пользовательским процессом и буфером аппаратной части. Скорость поступления данных в буфер не должна влиять на получение их пользовательским процессом.
6. Совместное использование устройств – необходимо, чтобы устройства коллективного доступа использовались максимально параллельно в соответствии с процедурами и приоритетами.
Программная организация ввода-вывода.
Механизм реализации рассмотрим на примере: организация печати строки на принтере. Этапы:
1. Сбор строки для печати в буфере пользовательского процесса.
2. Обращение к ОС выделить принтер для печати, если принтер занят, то по ходу завершения ОС принимает решение: что делать дальше. Возможно, процессу возвращается код ошибки, либо процесс блокируется до освобождения принтера. Если принтер свободен, данные из буфера пользовательского процесса копируются в буфер ОС (как правило, ядра). Из области ядра данные пересылаются в область реальной ОП, отведенной буферу для принтера. Принтер активизируется для печати.
3. Напечатав первый символ строки, ОС проверяет, готов ли принтер для печати следующего символа, пересылается новый символ, активизируется принтер. Печать.
Недостаток: центральный процессор занят всё время печати. Для устранения этого недостатка, строка(группа строк) для печати может пересылаться в память принтера, где печать осуществляется построчно, с предостовлением информации ЦП о выполненных действиях. После распечатки всей памяти осуществляется запрос на следующий блок. Возможно, в последовательности печатаемых символов появляются управляющие символы. На момент печати сроки принтер отключается от ЦП, сообщая об этом ОС и ОС планирует предоставление ЦП другому процессу.
Уровни реализации ввода-вывода.
Как правило, в систему реализации ввода-вывода входят 4 уровня:
1 - само внешнее устройство(аппаратура)
2 - обработчики прерываний
3 - драйверы устройств
4 - диспетчеры ввода-вывода ОС
Обработчики прерываний
При обработки прерывания, как правило, выполняются следующие действия:
- сохранение доступных регистров, содержимого стека... текущего процесса
- определение адреса программы-обработчика прерываний и настройка соответствующих управляющих таблиц
- разрешение прерывания – передача управления обработчику прерывания данного типа
- если внештатной или сбойной ситуации нет, продолжить текущий процесс(может и не тот, что ждет прерывание)
Драйверы устройств.
Как правило, для управления внешними устройствами ОС содержит компоненты, которые в различных ОС называются по-разному(метод доступа, драйверы устройств и тп). Структура драйвера и механизм управления внешними устройствами могут варьироваться в зависимости от ОС.
Пример:
Структура типового драйвера рассмотрим на примере драйвера для ОС MS-DOS.
В данной ОС для доступа к устройству указывается имя файла или номер устройства, к которому происходит обращение. Для обращения к данным(файлу) в первую очередь выполняется так называемая процедура открытия OPEN, которая создает блок управления файлом FCB(file control block). FCB содержит информацию о механизме доступа к устройству. После этого можно использовать принятые в ОС механизмы по обслуживанию операций ввода-вывода. Запрошенное обслуживание, преобразвованное в определенную последовательность команда передается в контроллер. Каждое устройство имеет набор программок для выполнения каждого запроса. В целом, набор этих программ образует драйвер устройства. DOS преобразует запрос на обслуживание в последоватьелность команд драйвера и передает их нужному драйверу. Драйверы находятся в области реальной ОП, отведенной для DOS. Драйверы различных устройств хранятся в ОП и образуют цепочку. Для поиска нужного драйвера. Для поиска нужного драйвера имеется указатель на цепочку. В ОП драйверы загружаются на этапе NIP.
Структура драйвера:
Драйвер устройства для MS-DOS состоит из 5 частей:
- заголовок устройства – содержит информацию о самом драйвере, не содержит код. В нем находится информация о типе устройства и ссылка на адрес следующего драйвера.
- область локальных данных и локальных процедур – содержит необходимые для работы драйвера буферы и процедуры;
- процедура-стратегия – объединяется с процедурой-прерыванием при обработке каждого запроса на обслуживание устройства;
- процедура-прерывание – объединяется с процедурой-стратегией при обработке каждого запроса на обслуживание устройства;
- обработка команд – непосредственно набор команд для выполнения запроса.
взаимодействие MS-DOS с драйвером – при вызове DOS-драйвера ему в качестве параметра передается так называемый заголовок запроса(некоторая структура данных).
Формат запроса:
1 - длина в байтах данного заголовка запроса
2 - номер устройства(когда драйвер управляет несколькими устройствами)
3 - код команды ввода-вывода
4 - информация об окончании операции
5 - резерв
6 - данные(параметры) команды
DOS автоматически создает заголовок запроса, когда пользовательский процесс осуществляет озапрос на ввод-вывод. Заголовок запроса находится в реальной ОП в области DOS. Адрес заголовка сообщается драйверу, когда ему переддается управление, через один из регистров. Драйвер запоминате адрес заголовка запроса в области локальных данных и локальных процедур. Для обработки запроса ввода-вывода DOS вызывает драйвер дважды: в первый раз управление передается части драйвера – стратегия, во второй раз – прерывание. Процедура-стратегия – набор инструкций, которые производят настойку драйвера в зависимости от кода команды и параметров. Процедура-прерывание использует результаты процедуры-стратегии для обработки команды ввода-вывода. Двукратный выхов необходим для возможной организации мультидоступа нескольких процессов к устройству. В этом случае организуется связанный список(цепочка) всех запросов драйвера(всех вызовов процедуры "стратегия"), а все вызовы для выполнения фактической работы помещаются в другую цепочку – в цепочку "прерывания". При организации запроса учитывается приоритет: ОС – высокий, пользовательская программа – низкий. Цепочка "стратегия" и цепочка "прерывания" могут не совпадать. Процедура прерывания обрабатывает заголовок запроса и передает управление обработке команды. Выполнение операции ввода-вывода происходит следующим образом(на примере записи):
1. Процесс выдает запрос на обслуживание по записи.
2. DOS преобразует запрос записи в физический адрес накопителя.
3. DOS определяет нужный драйвер диска и вызывает драйвер.
4. Драйвер обращается к рограммам обслуживания диска BIOS для выполнения записи.
5. Стандартная программа BIOS производит запись на диск.
6. Возврат в DOS.
7. Возврат в процесс.
Организация ввода-вывода в Windows2000: одной из целей при создании Windows2000 была переносимость на различные аппаратные платформы. Решить эту задачу трудно, тк на различный платформах управление регистрами, DMA и прерываниями осуществляется по-разному(то есть, различия не только в системе команд процессора). Перекомпилировать ядро и компонетны, взаимодействующие с аппаратурой проблематично из-за различий во многих мелких деталях. Для того, чтобы скрыть эти различия, на нижнему уровне была разработана специальная подсистема – HAL. Идея – предоставлять всей остальной части ОС абстрактные виртуальные устройства, эти устройства представляются в виде машинно-независимых служб(процедурных вызовов и макросов), которые могут использоваться основной частью ОС и драйверами. Т.к. драйверы и ядро ОС пользуются службами HAL(идентичными для всех программно-аппаратных платформ, на которые планировалось установить Windows2000) и не обращаются к устройствам напрямую, требуется значительно меньше изменений для их переноса с платформы на платформу. Перенести сам HAL менее проблемматично, так как весь машинно-зависимый код сосредоточен в одном месте(новая платформа – новый HAL).
Как правило, уровень HAL включает следующие основные опции:
- адресацию устройств
- управление регистрами
- обработка/возврат из прерываний
- операци с DMA
- управление устройствами службы времени
- интерфейс с BIOS
- ...
Упрощенно место HAL в структуре Windows2000 можно изобразить следующим образом:
Переносимость адресации устройств осуществляется за счет отображения физических адресов на логические адреса. Структура логического адреса сходна по формату с используемыми в Windows2000 дискрипторами системных ресурсов. Переносимость прерываний обеспечивается двумя службами HAL:
- уникальным наименованием прерываний в каждой конкретной платформе
- связыванием прерываний с драйверами устройств.
Переносимость механизма DMA обеспечивается службой, которая позволяет управлять как единой для всех механизмом DMA, так и специфическими для разных платформ.
Уровень HAL обеспечевает синхронизацию при SMP и настройку своих служб в зависимости от конфигурации BIOSа.
Во время установки Windows2000 в зависимости от платформы выбирается наиболее подходящих тип HAL. В данной ОС драйверы устройств могут выполнять специфические ф-ии, не связанные конкретно с внешним устройством, например, кодировки информации или быстрого доступа к некотормы структурам данных ядра. Выполнение запросов на ввод-вывод выполняется с помощью API. Запросы на ввод-вывод передаются драйверам в виде стандартных пакетов, которые назвыются IRP. При создании драйвера для Windows2000 он должен удовлетворять следующим требованиям: должен поддерживать работу с объектами в формате, принятом в Windows2000, должен поддреживать устройства Plug&Play, должен поддреживать режим энергосбережения для внешних устройств, должен быть настраиваемым, то есть не иметь встроенной поддержки определеннных аппаратных опций, должен поддерживать функционирование в многопроцессорной системе.