Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!Ответы по аппаратке.doc
Скачиваний:
8
Добавлен:
19.09.2019
Размер:
877.06 Кб
Скачать
  1. Апаратні і програмні переривання. Джерела переривань і їхня обробка.

Программный код — это последовательность команд, или инструкций, каждая из которых определенным образом закодирована и расположена в целом числе смеж­ных байт памяти. Каждая инструкция обязательно имеет операционную часть, несущую процессору информацию о требуемых действиях. Операндная часть, указывающая процессору, где находится его «предмет труда» — операнды, мо­жет присутствовать в явном или неявном виде и даже отсутствовать. Операнд­ная часть может описывать от нуля до двух операндов, участвующих в данной инструкции (есть инструкции, в которые кроме двух операндов задается еще и параметр инструкции). Здесь могут быть сами значения операндов (непосред­ственные операнды); явные или неявные указания на регистры процессора, в которых находятся операнды; адрес (или его составная часть) ячейки памяти или порта ввода-вывода; регистры процессора, участвующие в формировании адреса и разные комбинации этих компонентов. Длина инструкции в семействе х86 может быть от одного до 12 байт и определяется типом инструкции. Истори чески сложившийся формат инструкций х86 довольно сложен, и «понять», сколь-байт занимает конкретная инструкция, процессор может, лишь декодировав первые 1-3 байт. Инструкции могут предшествовать префиксы (к счастью, .тда однобайтные), указывающие на изменение способа адресации, размера еранда или (и) необходимость многократного (по счетчику и условию) повто-лия для данной инструкции. Адрес (логический) текущей исполняемой инст-кции хранится в специальном регистре — указателе инструкций IP (Instruction inter), который соответствует счетчику команд фон-неймановской машины. еле исполнения так называемой линейной инструкции этот указатель увели-тазает свое значение на ее длину, то есть он укажет на начало следующей инст-Тухции. Линейная инструкция не нарушает порядок выполнения, определяемый последовательностью расположения инструкций в памяти (по нарастанию адре-а). Кроме линейных инструкций существуют инструкции передачи управления, дади которых различают инструкции переходов и вызовов процедур. Эти инст-црукции в явном или неявном виде содержат информацию об адресе следующей ■мполняемой инструкции, который может указывать на относительно проговоль-ячейку памяти. Инструкции переходов и вызовов могут быть безусловными от чего не зависящими) и условными. Произойдет ли условный переход (вы-аош) или нет, зависит от состояния флагов (признаков) на момент исполнения дайной инструкции. Если переход (вызов) не состоится, то исполняется инст-щрщия, расположенная в памяти вслед за текущей. Вызов процедуры характерен швш, что перед ним процессор сохраняет в стеке (стек — это область ОЗУ) адрес (ииедующей инструкции, и на этот адрес передается управление после заверше-шшя исполнения процедуры (этот адрес извлекается из стека при выполнении тиштрукции возврата). Переход выполняется безвозвратно.

Последовательность исполнения инструкций, предписанная программным ■■дом, может быть нарушена под воздействием внутренних или внешних (отно-ьно процессора) причин. К внутренним причинам относятся исключения ptions) — особые ситуации, возникающие при выполнении инструкций. I ИНиглядным примером исключения является попытка деления на ноль. При воз-1 иикновении условия исключения процессор автоматически выполняет вызов жщроцедуры обработки исключения, после которой он может вернуться к повтор-гшшу исполнению инструкции, породившей исключение, или следующей за ней. ант поведения зависит от типа произошедшего исключения. Исключения «о используются современными операционными системами. На основе об-(■ботки исключений строится система виртуальной памяти и реализуются мно-функции многозадачных операционных систем. Внешними причинами изме-нормальной последовательности инструкций являются аппаратные пре-ия — вызовы процедур под воздействием электрических сигналов на спе-ные выводы процессора (см. п. 5.2.3). Эти сигналы могут подаваться со-;енно неожиданно для исполняемой программы, правда, у программиста есть жность заставить процессор (компьютер) игнорировать все прерывания или часть. Злоупотреблять этой возможностью нельзя (да и не всегда она есть), ■■скольку на аппаратных прерываниях строится, например, отсчет времени и Другие системные и прикладные функции компьютера. Источниками аппарат-прерываний являются контроллеры и адаптеры периферийных устройств, Нивраторы меток времени, системы управления питанием и другие подсистемы.

Есть еще так называемые программные прерывания, но они отнюдь не нарушают последовательность инструкций, предписанную программистом. Поэтому преры­ваниями они, по сути, не являются — это всего лишь особый способ вызова сис­темных сервисов BIOS (см. п. 15.4) и операционной системы. И, наконец, после­довательность инструкций может изменяться по сигналу аппаратного сброса или инициализации процессора. С этого, собственно, и начинается функционирова­ние компьютера: процессор переводится в исходное состояние и «выпускается» в работу. При этом указатель инструкций совместно с другими регистрами, уча­ствующими в формировании адреса инструкции, генерирует адрес, на 15 байт меньший максимального физического адреса. По этому адресу должна распола­гаться инструкция, с которой начинается инициализация компьютера.

В компьютере обязательно должен присутствовать центральный процессор (CPU — Central Processing Unit), который исполняет основную программу. В многопроцессорной системе функции центрального процессора распределяют­ся между несколькими обычно идентичными процессорами для повышения об­щей производительности системы, а один из них назначается главным. В по­мощь центральному процессору в компьютер часто вводят сопроцессоры, ориен­тированные на эффективное исполнение каких-либо специфических функций. Широко распространены математические сопроцессоры, обрабатывающие чис­ловые данные в формате с плавающей точкой; графические сопроцессоры, выпол­няющие геометрические построения и обработку графических изображений; со­процессоры ввода-вывода, разгружающие центральный процессор от несложных, но многочисленных операций взаимодействия с устройствами. Возможны и дру­гие сопроцессоры, однако все они несамостоятельны — исполнение основного вычислительного процесса осуществляется центральным процессором, который в соответствии с программой выдает «задания» сопроцессорам на исполнение их «партий».

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

5.2.3. Прерывания и исключения

Прерывания и исключения нарушают нормальный ход выполнения программы для обработки внешних событий или сигнализации о возникновении особых ус­ловий или ошибок. По прерыванию или исключению процессор сохраняет в сте­ке регистр (E)FLAGS и указатель CS:(E)IP на ту инструкцию, которую он должен будет выполнить после обработки прерывания. Этой инструкцией будет следую­щая за той, во время исполнения которой произошло прерывание, или та же самая (в защищенном режиме при возникновении ряда исключений в стеке со­храняется еще и код ошибки). После сохранения этих значений процессор пере­ходит к исполнению кода обработчика данного прерывания (исключения), опре­деляя точку входа в него через номер (0-255) по таблице прерываний. Номер элемента в таблице прерываний называется вектором прерывания, он определя­ется источником прерывания (исключения). Обработчик прерывания (исключе­ния) должен заканчиваться специальной инструкцией возврата IRET, по которой из стека восстанавливается указатель CS:(E)IP и прежнее значение флагов. Для исключений, в которых сохраняется и код ошибки, обработчик до выполнения инструкции IRET должен извлечь из стека код ошибки. Различают четыре источника прерываний.

ш Внутренние прерывания (исключения) процессора и сопроцессора; вектор определяется типом произошедшего события.

ш Немаскируемые внешние прерывания по входу NMI; вектор фиксирован (01).

т Маскируемые внешние прерывания по входу INT (или по шине APIC); век­тор передается контроллером прерываний.

ш Программно-вызываемые прерывания; вектор определяется в команде.

Последние из этого списка в прямом смысле прерываниями не являются, по­скольку представляют собой лишь специфический способ вызова процедур — не по адресу, а по его номеру в таблице, причем независимо от состояния флага IF. Программные прерывания широко используются для вызовов сервисов BIOS и ОС — это компактно и удобно.

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

Маскируемые внешние прерывания обрабатываются процессором по сигналу на входе INT только при установленном флаге разрешения прерываний IF.

Немаскируемые прерывания обрабатываются процессором независимо от со­стояния флага разрешения прерывания IF. К ним относятся прерывания, прихо­дящие по линии NMI (Non-Maskable Interrupt), а для процессоров, поддерживаю­щих режим системного управления, еще и по линии SMI# (System Management Interrupt).

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

Каждому номеру (0-255) прерывания или исключения соответствует элемент з таблице дескрипторов прерываний IDT (Interrupt Descriptor Table). В реальном зежиме таблица прерываний содержит дальние адреса (двойные слова) обслу­живающих процедур и после сброса располагается, начиная с нулевых адресов. В защищенном режиме таблица IDT содержит 8-байтные дескрипторы прерыва­ний, может хранить от 32 до 256 дескрипторов и располагаться в любом месте Эизической памяти.

Под исключения (внутренние прерывания) в процессорах Intel резервируют-:я векторы 0-31 в таблице прерываний, однако в PC часть из них перекрывает-:я системными прерываниями — сервисами BIOS и DOS, а также аппаратными

прерываниями. Эти перекрытия особенно неприятны для защищенного режима: они усложняют процедуры обработчиков прерываний.

Для обработки аппаратных прерываний в многопроцессорных системах тра­диционные аппаратные средства становятся непригодными, поскольку прежняя схема подачи запроса INTR и передачи вектора в цикле INTA# явно ориентирова­на на единственность процессора. Для решения этой задачи в процессоры, начи­ная со второго поколения Pentium, введен расширенный программируемый кон­троллер прерываний APIC (Advanced Programmable Interruption Controller). Этот контроллер имеет внешние сигналы локальных прерываний LINT[1:O] и трехпро-водную интерфейсную шину (PICD[1:O] и PICCLK), по которым процессоры свя­зываются с контроллером APIC системной платы. Для локальных запросов пре­рываний процессоры имеют линии LINTO, LINT1. Локальные прерывания обслу­живаются только тем процессором, на выводы которого поступают сигналы их запросов. Общие (разделяемые) прерывания (в том числе и SMI) приходят ; процессорам в виде сообщений по интерфейсу APIC. При этом контроллеры пред­варительно программируются — тем самым определяются функции каждого и.г процессоров в случае возникновения того или иного аппаратного прерывания Контроллеры APIC каждого из процессоров и контроллер системной платы, свя­занные интерфейсом APIC, выполняют маршрутизацию прерываний (Interrupt Routing), причем как статическую, так и динамическую. Внешне программный интерфейс обработки прерываний остается совместимым с управлением контрол­лером 8259А, что обеспечивает прозрачность присутствия APIC для прикладно­го программного обеспечения. Режим обработки прерываний посредством APIC разрешается сигналом APICEN по аппаратному сбросу, впоследствии он может быть запрещен программно.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]