Ввод-вывод в операционной системе. Обработчики прерываний. Драйверы устройств. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Ввод-вывод в операционной системе. Обработчики прерываний. Драйверы устройств.



Обработчики прерываний

Хотя программный ввод-вывод иногда бывает полезен, для большинства опера­ций ввода-вывода прерывания являются необходимым фактом. Прерывания должны быть упрятаны как можно глубже во внутренностях операци­онной системы, чтобы о них знала как можно меньшая часть операционной систе­мы. Лучший способ спрятать их заключается в блокировке драйвера, начавшего операцию ввода-вывода, вплоть до окончания этой операции и получения преры­вания.

Когда происходит прерывание, начинает работу обработчик прерываний. По окончании необходимой работы он может разблокировать драйвер, запустивший его. В некоторых случаях используется выполнение процедуры up на семафоре.

В других случаях обработчик прерываний вызывает процедуру монитора signal с переменной состояния. В третьем случае он посылает заблокированному драй­веру сообщение. В любом случае драйвер разблокируется обработчиком прерыва­ний. Эта схема лучше всего работает в драйверах, являющихся процессами ядра со своим собственным состоянием, стеком и счетчиком команд.

Конечно, в действительности все обстоит совсем не так просто. Обработать пре­рывание значительно сложнее, чем просто принять его, выполнить up на семафо­ре, после чего вернуться из прерывания в предыдущий процесс с помощью коман­ды процессора IRET. Операционной системе приходится выполнить значительно больше работы. Мы покажем схематичный набросок этой работы в виде набора шагов, которые следует выполнить программному обеспечению после того, как произошло аппаратное прерывание. Необходимо заметить, что детали во многом зависят от конкретной системы, поэтому на каких-то машинах некоторые перечис­ленные шаги могут оказаться лишними, зато может потребоваться выполнение других, не помещенных в список шагов. Кроме того, на разных машинах может потребоваться выполнение перечисленных действий в разном порядке.

· Сохранить все регистры (включая PSW), не сохраненные аппаратурой.

· Установить контекст для процедуры обработки прерываний. Выполнение этого действия может включать установку TLB, MMU и таблицы страниц.

· Установить указатель стека для процедуры обработки прерываний.

· Выдать подтверждение контроллеру прерываний. Если централизованного контроллера прерываний нет, разрешить прерывания.

· Скопировать содержимое регистров с того места, где они были сохранены (возможно, в каком-либо стеке), в таблицу процессов.

· Запустить процедуру обработки прерываний. Она извлечет информацию из регистров контроллера устройства, инициировавшего прерывание.

· Выбрать процесс, которому передать управление. Если прерывание разбло­кировало какой-либо высокоприоритетный процесс, он может быть выбран в качестве следующего.

· Установить контекст MMU для следующего работающего процесса. Также может понадобиться определенная установка TLB.

· Загрузить регистры нового процесса, включая его PSW.

· Начать выполнение нового процесса.

Обработка прерываний состоит из значительного количества команд процессора, особенно на машинах с виртуальной памятью, на которых необходимо восстанавливать состо­яние таблиц памяти или сохраненное состояние MMU. На некоторых машинах буфер быстрого преобразования адреса TLB и кэш цент­рального процессора также требуют управления при переключении режимов пользователя и ядра, для чего необходимы дополнительные машинные циклы.

Драйверы устройств

У каждого контроллера есть набор регистров, исполь­зуемых для того, чтобы давать управляемому им устройству команды и читать со­стояние устройства. Число таких регистров и команды, выдаваемые устройствам, зависят от конкретного устройства. Например, драйвер мыши должен принимать от мыши информацию о том, насколько далеко она продвинулась по горизонтали и вертикали, а также о нажатых кнопках мыши. Драйвер диска, в отличие от драй­вера мыши, должен знать о секторах, дорожках, цилиндрах, головках, их переме­щении и времени установки, двигателях и тому подобных вещах, необходимых для правильной работы диска. Очевидно, что эти драйверы будут сильно различаться.

Поэтому для управления каждым устройством ввода-вывода, подключенным к компьютеру, требуется специальная программа. Эта программа, называемая драйвером устройства, обычно пишется производителем устройства и распрост­раняется вместе с устройством. Поскольку для каждой операционной системы требуются специальные драйверы, производители устройств обычно поставляют драйверы для нескольких наиболее популярных операционных систем.

Каждый драйвер устройства обычно поддерживает один тип устройств или, максимум, класс близких устройств.

Чтобы получить доступ к аппаратной части устройства, то есть к регистрам кон­троллера, драйвер устройства должен быть частью ядра операционной системы, по крайней мере, в существующих на сегодняшний день архитектурах. В действительности, возможно, создать драйвер, работающий в пространстве пользовате­ля, с системными вызовами для чтения и записи регистров устройств. Это было бы неплохой идеей, так как позволило бы изолировать ядро от драйверов, а драйверы друг от друга. При этом была бы устранена основная при­чина крушения операционной системы — драйверы, содержащие ошибки, сталки­вающиеся с ядром тем или иным образом.

Операционная система обычно классифицирует драйверы по нескольким кате­гориям в соответствии с типами обслуживаемых ими устройств. К наиболее общим категориям относятся блочные устройства, например, диски, содержащие блоки данных, к которым возможна независимая адресация, и символьные устройства, та­кие как клавиатуры и принтеры, формирующие или принимающие поток символов.

В большинстве операционных систем определен стандартный интерфейс, кото­рый должны поддерживать все блочные драйверы, и второй стандартный интерфейс, поддерживаемый всеми символьными драйверами. Эти интерфейсы включают наборы процедур, которые могут вызываться остальной операционной системой для обращения к драйверу. К этим процедурам относятся, например, процедуры чтения блока (блочного устройства) или записи символьной строки (для символь­ного устройства).

У драйвера устройства есть несколько функций. Наиболее очевидная функция драйвера состоит в обработке абстрактных запросов чтения и записи независимо­го от устройств программного обеспечения, расположенного над ними. Но кроме этого они должны также выполнять еще несколько функций. Например, драйвер должен при необходимости инициализировать устройство. Ему также может по­надобиться управлять энергопотреблением устройства и регистрацией событий.

Многие драйверы устройств обладают сходной общей структурой. Типич­ный драйвер начинает с проверки входных параметров. Если они не удовлетворя­ют определенным критериям, драйвер возвращает ошибку. В противном случае драйвер преобразует абстрактные термины в конкретные.

Затем драйвер может проверить, не используется ли это устройство в данный момент. Если устройство занято, запрос может быть поставлен в очередь. Если устройство свободно, проверяется аппаратный статус устройства, чтобы понять, может ли запрос быть обслужен прямо сейчас. Может оказаться необходимым включить устройство или запустить двигатель, прежде чем начнется перенос данных. Как только устройство включено и готово, может начинаться собственно управление устройством.

Управление устройством подразумевает выдачу ему серии команд. Именно в драйвере определяется последовательность команд в зависимости от того, что должно быть сделано. Определившись с командами, драйвер начинает записывать их в регистры контроллера устройства. После записи каждой команды в контрол­лер может быть нужно проверить, принял ли контроллер эту команду и готов ли принять следующую. Такая последовательность действий продолжается до тех пор, пока контроллеру не будут даны все команды. Некоторые контроллеры спо­собны принимать связные списки команд, находящихся в памяти. Они сами счи­тывают и выполняют их без дальнейшей помощи операционной системы.

После того как драйвер передал все команды контроллеру, ситуация может развиваться по двум сценариям. Во многих случаях драйвер устройства должен ждать, пока контроллер не выполнит для него определенную работу, поэтому он блокируется до тех пор, пока прерывание от устройства его не разблокирует. В дру­гих случаях операция завершается без задержек и драйверу не нужно блокиро­ваться.

В любом случае по завершении вы­полнения операции драйвер должен проверить, завершилась ли операция без оши­бок. Если все в порядке, драйверу, возможно, придется предать данные (например, только что прочитанный блок) независимому от устройств программному обеспе­чению. Наконец, драйвер возвращает некоторую информацию о состоянии для информирования вызывающей программы о статусе завершения операции. Если в очереди находились другие запросы, один из них теперь может быть выбран и запу­щен. В противном случае драйвер блокируется в ожидании следующего запроса.

Во-первых, устройство ввода-вывода может завершить выполнение операции во время работы драйвера, таким образом пре­рывая его работу. Во-вторых, во время обработки сетевым драйвером пришедше­го пакета может прийти еще один пакет. Соответственно, драйвер должен быть готов к тому, что во время обработки пер­вого вызова может последовать другой вызов.

Драйверам не разрешается обращаться к системным вызовам, но им часто бы­вает необходимо взаимодействовать с остальным ядром. Обычно разрешаются об­ращения к некоторым системным процедурам.



Поделиться:


Последнее изменение этой страницы: 2016-09-19; просмотров: 586; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.126.241 (0.007 с.)