Найти тему
IT. Как это работает?

От транзистора до фреймворка. Часть 19. Аппаратное прерывание

Оглавление

Видео: YouTube

В этом выпуске рассмотрим очень важный вопрос, это прерывания. Что это такое? Если сказать просто, то это временная остановка выполнения программы для совершения других действий. Может это не совсем точно, но очень просто.

Какие бывают прерывания?

Как известно, инструкции программы выполняются на процессоре.

Разновидность прерываний
Разновидность прерываний

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

  • Аппаратное прерывание
  • Программное прерывание
  • Исключение

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

Пример прерывания

Рассмотрим подключение клавиатуры к компьютеру.

Клавиатура и коды клавиш
Клавиатура и коды клавиш

Сейчас уже редко встречаются клавиатуры с разъемом PS/2, все больше USB, но это сейчас не так важно, это такие же последовательные интерфейсы передачи данных. При нажатии клавиши ее код передается в компьютер через интерфейс. Внутри корпуса клавиатуры расположена весьма интересная конструкция столбцов и строк контактов, которые замыкаются клавишами.

Устройство клавиатуры
Устройство клавиатуры

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

Устройство сопряжения
Устройство сопряжения

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

Адресное пространство пользователя

Вспомним адресное пространство учебного компьютера, рассмотренное в предыдущей статье.

Адресное пространство процесса
Адресное пространство процесса

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

Адресное пространство процесса пользователя
Адресное пространство процесса пользователя

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

Адресное пространство ядра операционной системы

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

Адресное пространство процесса ядра операционной системы
Адресное пространство процесса ядра операционной системы

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

Таблица векторов прерываний
Таблица векторов прерываний

Занимают они 512 байт. Каждое слово называется вектором прерывания. Представляет собой адрес функции, занимающейся обработкой прерывания. Каким образом процессор понимает, что пора обработать какую-либо ситуацию?

Линии прерывания

В системной шине предусмотрена специальная линия для передачи сигнала о прерывании от периферийного устройства до контроллера шины.

Линии прерывания
Линии прерывания

Номер прерывания выставляется на другие линии шины. Этот номер соответствует своему вектору прерывания. К примеру, если периферийное устройство выставило номер прерывания 6, адрес, содержащийся в шестом векторе прерывания будет загружен в регистр указателя инструкции и начнется выполнение функции обработчика прерывания.

Переход на функцию обработчик прерывания
Переход на функцию обработчик прерывания

Задачей функции в нашем случае является скопировать все коды нажатых клавиш в область данных в оперативной памяти. А теперь нужно сбавить обороты и обратить внимание на одну очень важную тонкость.

Контекст процесса

До получения прерывания прикладная программа пользователя беззаботно выполнялась на процессоре, занимая при этом все регистры,
это не только регистры общего назначения от
R0 до R4, это также флаги, указатель стека SP, указатель инструкции PC.

Контекст процесса
Контекст процесса

Также нужно не забыть про регистры страниц, регистры их атрибутов и все остальные регистры. Чтобы управление перешло к операционной системе, нужно обновить полностью содержимое всех регистров. Во первых, адресные регистры PAR0PAR15, чтобы ссылаться на совсем другую область физической памяти. Также необходимо сменить атрибуты страниц ATTR0ATTR15, указать вершину совсем другого стека SP и так далее. А чтобы вернуться потом к выполнению программы пользователя с того места где остановились нужно перед обработкой прерывания сохранить все необходимые регистры в выделенную область памяти. Всем этим занимается программный код операционной системы. Совокупность всех регистров, представляющих пользовательскую программу называется ее контекстом. Таким образом, основными действиями при обработке прерывания являются:

  • сохранение контекста программы или приложения пользователя,
  • загрузка контекста операционной системы,
  • выполнение всего программного кода прерывания и наконец,
  • восстановление контекста прерванного приложения пользователя.

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

Эпилог

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

Продолжение следует...