Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все ответы.doc
Скачиваний:
21
Добавлен:
09.09.2019
Размер:
3.79 Mб
Скачать

69: Управляемый прерываниями ввод-вывод

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

70: Ввод-вывод с использованием dma(Direct Memory Access).

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

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

71. Программные уровни ввода-вывода

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

PSW – слово состояния процессора

TLB – буфер быстрого преобразования адреса