Добавлен: 20.10.2018
Просмотров: 1035
Скачиваний: 5
12. Управление внешними устройствами
Подсистема ввода/вывода данных – это комплекс технических и
программных средств, используемых для взаимодействия ВС с внешним
миром. За время существования вычислительной техники было создано
множество разнообразных устройств ввода/вывода со своими параметрами и
характеристиками. Более того, устройство одного и того же типа (например,
лазерный принтер), как правило, выпускается в разных модификациях.
Совершенно очевидно, что прикладным программам не обязательно знать о
конкретном используемом виде устройства, поэтому важнейшая задача
подсистемы ввода/вывода – это экранирование приложений от технических
особенностей используемых устройств.
По этой причине подсистема ввода/вывода в современных ОС строится по
многоуровневому принципу:
нижний (аппаратный) слой включает два уровня:
o
сами устройства ввода/вывода;
o
электронные схемы для управления этими устройствами
(контроллеры);
верхний (программный) слой включает следующие уровни:
o
специализированные программы-драйверы для
непосредственного управления устройствами;
o
независимые от устройств управляющие программы ядра
системы (диспетчер ввода/вывода);
o
программное обеспечение ввода/вывода на уровне пользователя,
т.е. высокоуровневые системные вызовы для операций
ввода/вывода.
Далее каждый из уровней рассматривается более подробно.
К основным устройствам ввода/вывода относятся: клавиатура, мышь,
различные манипуляторы, монитор, принтер, сканер, цифровой фотоаппарат,
видеокамера, модем, диски разных типов, сетевые платы и т.д. Все они
имеют разные характеристики и могут классифицироваться по разным
признакам.
Прежде всего, устройства ввода/вывода достаточно условно можно
разбить на две большие группы – символьные и блочные. Символьные
устройства обрабатывают последовательность (поток) байтов строго друг за
другом. Блочные устройства позволяют группировать соседние байты в
блоки с возможностью адресации каждого блока в отдельности, независимо
от других блоков. Типичный пример – дисковые накопители.
Другой очевидной классификацией устройств является их специализация
– одни устройства предназначены только для ввода данных, другие – только
для вывода, третьи могут выполнять оба действия.
Непосредственное управление устройствами выполняют электронные
схемы-контроллеры. Несмотря на их многообразие, есть ряд принципов,
приложение
приложение
приложение
программное обеспечение ввода/вывода на уровне пользователя
управляющие программы ввода/вывода
драйвер
устройства
драйвер
устройства
драйвер
устройства
контроллер
устройства
контроллер
устройства
контроллер
устройства
устройство
ввода/вывода
устройство
ввода/вывода
устройство
ввода/вывода
общих для всех контроллеров. Важнейшее свойство контроллеров – это
наличие специальных регистров, через которые организуется все общение
операционной системы с устройствами. Как правило, регистры
специализируются в зависимости от их назначения следующим образом:
регистр состояния содержит биты, определяющие текущее состояние
устройства (свободно/занято, готово к выполнению команды, успешное
или ошибочное завершение команды); биты регистра состояния
формируются самим устройством и могут лишь читаться программами
ОС;
управляющий регистр содержит очередную команду, которую должно
выполнить устройство (занести байт(ы) в регистр данных, взять
байт(ы) из регистра данных и обработать его);
регистр входных данных, в который устройство помещает очередной
байт (или несколько байтов) данных и откуда этот байт (байты)
считывается системой;
регистр выходных данных, в который система помещает очередной
байт (байты) выводимых данных для обработки его устройством.
Разрядность регистров определяется разрядностью соответствующей
шины. Если для первых двух регистров достаточно одного-двух байтов, то
данные могут передаваться группами по 4 байта.
регистр
состояния
регистр
управления
регистр
входных
данных
регистр
выходных
данных
подсистема ввода/вывода ОС
устройство ввода/вывода
Каждому регистру каждого установленного в системе устройства
присваивается порядковый номер-адрес, для обозначения которого
используется термин “порт ввода/вывода”. Набор используемых в системе
портов образует адресное пространство ввода/вывода. Это адресное
пространство может либо занимать часть адресов основного адресного
пространства, либо существовать отдельно от него. Часто используется
комбинированный подход – адреса портов состояния и управления
реализуются как самостоятельное адресное пространство, а порты для
непосредственного обмена данными занимают часть основной памяти.
Для взаимодействия с портами ввода/вывода в систему команд часто
вводятся специальные команды ввода/вывода:
записать один-два байта в порт с заданным номером (команда OUT);
прочитать один-два байта из порта с заданным номером (команда IN).
Эти команды относятся к группе привилегированных, т.е. они могут
выполняться только в режиме ядра. Попытка выполнения этих команд
внутри прикладной программы, работающей в пользовательском режиме,
приводит к аварийному прерыванию выполнения программы. Такой подход
позволяет изолировать приложения от непосредственного общения с
устройствами ввода/вывода. Только программы ядра системы имеют право
напрямую общаться с устройствами, тогда как приложения для данных целей
должны использовать специальные системные вызовы. Это особенно важно
для многозадачных ОС, где централизованное управление всеми ресурсами
(к которым относятся и устройства ввода/вывода) является чрезвычайно
важной задачей.
Программирование
операций
ввода/вывода
на
уровне
команд
представляет собой достаточно сложную задачу, решение которой требует
знания тонкостей работы конкретного устройства. Поэтому в подсистему
ввода/вывода включается специальный уровень программ-драйверов, как
правило, создаваемых фирмами
−
разработчиками аппаратуры. Набор
драйверов – это важнейшая часть подсистемы ввода/вывода и операционной
системы в целом. Для устранения возможного разнобоя при написании
драйверов используются специальные правила, четко регламентирующие
процесс взаимодействия драйверов как с ядром системы, так и с
контроллерами устройств. Например, для написания драйверов для ОС
семейства Windows корпорация Microsoft разработала специальный стандарт
Windows Driver Model (WDM). Для облегчения написания драйверов в
соответствии с этим стандартом разработан целый ряд программных
инструментов (DDK – Driver Development Kit).
В целом, каждый драйвер должен предоставлять четко определенный
набор функций, которые могут вызываться программами более высокого
уровня. Типичный алгоритм взаимодействия драйвера с устройством и с
вышележащим программным уровнем включает следующие шаги:
1. Драйвер получает от управляющего уровня команду на выполнение
операции ввода/вывода.
2. Драйвер записывает в управляющий порт контроллера сигнал “начать
операцию”.
3. В ответ на это устройство устанавливает в регистре состояния
соответствующий признак возможности выполнения операции.
4. Драйвер проверяет значение этого признака и в зависимости от
результата либо продолжает процесс взаимодействия, либо прекращает
его с выдачей сообщения на более высокий уровень.
5. Если операция возможна, драйвер записывает в управляющий порт код
операции.
6. Если выполняется операция вывода, то драйвер в порт выходных
данных записывает и сам выводимый элемент данных.
7. Когда устройство закончит обработку элемента данных, то оно в порт
состояния помещает признак успешного завершения, а при вводе еще и
заносит во входной порт элемент данных.