
- •1. Методы оценки производительности эвм(по пособию “Организация эвм”)
- •2. Структура пэвм (по му к выполнению лр)
- •3. Модули (динамических) оперативных зу на бис (по пособию “Организация эвм”)
- •4. Привилегии в пэвм (по архиву сайта: файл prvlg.Doc)
- •6. Формирование адресов микрокоманд (по пособию “Управление “эвм”)
- •7. Иерархия зу вычислительных систем ( пособие “Организация эвм” 1.2.1. Классификация зу по функциональному назначению)
- •8. Сегментная и страничная адресация памяти (первые две страницы – из фирменного руководства Intel)
- •9. Система прерываний пэвм (Лекц, м.Гук)
- •10. Способы адресации в пэвм с 32-разрядной архитектурой(Лекц, м.Гук)
- •11. Передача данных с прямым доступом к памяти (Лекц, м.Гук)
- •12. Особенности эвм с конвейерными архитектурами
8. Сегментная и страничная адресация памяти (первые две страницы – из фирменного руководства Intel)
Многоуровневая организация памяти ЭВМ требует управления размещением информации в системе памяти и ее передачей между уровнями памяти. Возлагать эти задачи на прикладного программиста в мультипрограммном окружении нельзя, поэтому они решаются совместно аппаратными средствами ЭВМ и средствами операционной системы. Привлечение аппаратных средств необходимо для того, чтобы управление памятью не занимало много ресурсов ЭВМ или системы.
Основными задачами управления многоуровневой памятью можно считать:
- разделение памяти между несколькими программами, выполняемыми в ЭВМ, работающей в многопрограммном режиме
- упрощение для прикладных программ (и программистов) использования многоуровневой памяти, вплоть до представления ее в виде логически однородного пространства памяти (“виртуальной памяти”)
- выделение места для данных и команд программы в верхних уровнях памяти (кэш, оперативная память)
- определение местонахождения требуемой информации в системе памяти
- обмен информацией между уровнями памяти
- защита информации различных программ от сбоев и несанкционированных воздействий.
Общий подход к решению перечисленных задач: концепция виртуальной памяти, предложенная еще в конце 50-х годов прошлого столетия, - фактически явился основой для организации управления многоуровневой памятью всех современных ЭВМ.
Виртуальную память можно рассматривать как отображение некоторого линейно упорядоченного множества (множества логических адресов) на множества адресов имеющихся в вычислительной системе запоминающих устройств, называемых физическими адресами. Более того, такое отображение может задаваться отдельно для каждой из выполняемых в системе программ. Кроме того, это отображение не является статическим (как отображение функция в математике), а может изменяться в любой момент времени.
Основными механизмами, используемыми для реализации виртуальной памяти ЭВМ, служат сегментное и страничное разделение памяти.
Сегментное разделение предполагает деление памяти на логические блоки – сегменты произвольной (переменной) длины. Это разделение чаще связывается с логической структурой выполняемых программ и кроме общих задач, связанных с управлением памятью, решает проблему изоляции программ друг от друга.
Страничное разделение предполагает деление памяти на блоки постоянной длины – страницы. Это разделение, напротив, в большей степени ориентируется на физическую память и управление передачей информации.
В ЭВМ могут использоваться как какой-либо один из этих механизмов, так и оба сразу.
Оба механизма основаны на том, что управлять блоками адресов памяти проще, чем каждым адресом в отдельности. При этом соответствие между логическими и физическими адресами задается с помощью таблиц, содержимое которых корректируется при каждой пересылке информации между ступенями памяти. (Здесь есть определенная аналогия с таблицей размещения файлов, строящейся операционной системой для хранения файлов на жестких дисках.) Эти таблицы могут носить различные названия и иметь разную структуру, но задача у них одинакова: отображать существующее в текущий момент времени соответствие между логическими и физическими адресами.
Организацию сегментного и страничного механизма можно проиллюстрировать на примере архитектуры процессоров Intel IA-86, реализующей оба этих механизма совместно.
Сегментация при работе ПЭВМ в защищенном режиме реализует функции защиты памяти, а в сочетании со страничным механизмом, по существу, представляет собой средство организации виртуальной памяти.
Средства управления памятью в ПЭВМ разделены на две части: механизм сегментации и страничный механизм.
Сегментация обеспечивает изоляцию отдельных модулей программ, данных и стека так, что несколько программ (или задач), могут выполняться на одном и том же процессоре без влияния друг на друга.
Страничный механизм обеспечивает реализацию традиционной виртуальной системы памяти со страничными запросами, при которой исполнительное окружение программы отображается на физическую память. Страничный механизм также может использоваться и для изоляции различных задач.
При работе в защищенном режиме сегментация обязательно используется, так как нет средств ее отключения. Страничный механизм, напротив, не является обязательным. Два этих механизма можно сконфигурировать для поддержки простых однопрограммных (или однозадачных) систем, многозадачных систем или многопроцессорных систем, разделяющих общую память.
Как
показано на рис. 3-1, сегментация
предоставляет средство разделения
адресуемого процессором пространства
памяти (называемогопространством
линейных адресов)
на меньшие подпространства, называемые
сегментами.
Сегменты могут использоваться для
хранения команд, данных и стека программы
или содержать структуры данных (такие
как сегмент состояния задачи или таблицу
дескрипторов). Если в процессоре
выполняется более одной программы, то
каждой из них может быть выделен свой
собственный набор сегментов. Процессор
устанавливает границы между этими
сегментами и обеспечивает то, что одна
программа не вмешивается в исполнение
другой посредством записи в сегменты
этой программы. Механизм сегментации
позволяет также типизировать сегменты
так, что некоторые операции могут
выполняться только с определенным типом
сегмента.
Все сегменты в системе принадлежат пространству линейных адресов процессора. Для локализации байта в некотором сегменте используются логические адреса (иногда называемые дальними указателями – far pointer). Логический адрес состоит из селектора сегмента и смещения. Селектор сегмента – это уникальный идентификатор сегмента. Среди прочей информации он указывает смещение в таблице дескрипторов (например, такой, как глобальная таблица дескрипторов – GDT) для доступа к структуре данных, называемой дескриптором сегмента. Каждому сегменту соответствует дескриптор сегмента, который указывает размер сегмента, права доступа и уровень привилегий для сегмента, его тип и размещение первого байта сегмента в пространстве линейных адресов (называемое базовым адресом сегмента). Для определения местоположения байта в сегменте смещение из логического адреса добавляется к базовому адресу сегмента. Базовый адрес с добавленным к нему смещением образуют линейный адрес в пространстве линейных адресов процессора.
Если страничный механизм не используется, то пространство линейных адресов процессора непосредственно проецируется на пространство физических адресов процессора. При этом пространство физических адресов определяется как диапазон адресов, которые процессор может генерировать на своей адресной шине.
Так как многозадачные вычислительные системы обычно определяют значительно большее пространство линейных адресов, чем то, которое по экономическим соображениям может быть одновременно размещено в физической памяти, необходимы некоторые методы “виртуализации” пространства линейных адресов. Эта виртуализация осуществляется через страничный механизм процессора.
Механизм страниц поддерживает окружение “виртуальной памяти”, в которой большое пространство линейных адресов моделируется с помощью меньшего количества физической памяти (оперативной или постоянной) и дисковой памяти. При использовании страничного механизма каждый сегмент разделяется на страницы (обычно, по 4 Кбайт каждая), хранящиеся либо в физической памяти, либо на диске. Операционная система или диспетчер использует каталог страниц и набор таблиц страниц для определения местоположения страниц. Когда программа (или задача) пытается обратиться по адресу в линейном пространстве адресов, процессор использует каталог страниц и таблицы страниц для преобразования (трансляции) линейного адреса в физические адреса, а затем производит запрошенную операцию (чтение или запись) с ячейкой памяти. Если страница, к которой производится доступ, отсутствует в физической памяти, то процессор прерывает выполнение программы (генерируя исключение страничного сбоя). Тогда операционная система или диспетчер считывает страницу с диска в физическую память, а затем продолжает выполнение программы.
При правильной реализации страничного механизма операционной системой или диспетчером, выполняемая программа не “замечает” обмена страницами между физической памятью и диском. Даже программы, написанные для 16-битной архитектуры Intel, могут использовать страничный механизм (“прозрачно”) при исполнении в режиме виртуального 8086.
В защищенном режиме для задания сегмента в 16-разрядных сегментных регистрах (CS, SS, DS, ES, FS, GS), а также регистрах LDTR и TR записываются, так называемые, селекторы сегментов, указывающие на дескрипторы сегментов, которые, в свою очередь указывают местоположение сегментов и их разновидность.
Дескриптор сегмента, описывает расположение сегмента в памяти, его размер и основные свойства.
Все дескрипторы хранятся в таблицах дескрипторов, расположенных в оперативной памяти. Таблицы могут быть трех типов:
LDT – локальная таблица дескрипторов, описывающая сегменты, доступные только той задаче, к которой она относится;
GDT – глобальная таблица дескрипторов, описывающая сегменты, доступные всем задачам;
IDT – таблица дескрипторов прерываний.
Сегменты различаются по типу на системные сегменты и сегменты кода (исполнительные) или данных (обычные данные или стек), что задается флагом S (segment descriptor) – бит 4 в байте 5 прав доступа дескриптора. Нулевое значение этого флага указывает на системный сегмент, единичное – на сегмент кода или данных.
Сегменты данных от сегментов кода отличаются значением бита флага E (executable – исполнительный) в том же байте 5 (бит 3) дескриптора, равным 1 для сегмента кода и 0 – для сегмента данных (или стека).
Байт 7 Байт 4
-
База сегм. [31:24]
G
D
/
B
0
-
Разм. сегм
[19:16]
P
DPL
S
TYPE
База сегм. [23:16]
База сегмента [15:0] (Segment Base)
Граница сегмента [15:0] (Segment Limit)
Байт 3 Байт 0
База сегмента (segment base), задаваемая байтами 2, 3, 4 и 7, указывает адрес, с которого начинается сегмент. Этот адрес называется линейным и определяет местоположение сегмента в виртуальном адресном пространстве, если страничный механизм включен. Если страничный механизм выключен, то этот адрес совпадает с физическим и указывает местоположение сегмента в оперативной памяти.
Поле граница сегмента (segment limit), формируемое байтами 0 и 1 и младшими разрядами байта 6, определяет физический размер сегмента в байтах или страницах (по 4096 байтов), что определяется значением бита G (granularity, старший бит байта 6): при G = 0, размер указывается в байтах, при G = 1 – в страницах. Однако сегменты (данных) могут располагаться в адресном пространстве по отношению к своей базе двояко: от базы в сторону увеличения адресов или от базы в сторону уменьшения адресов, (что определяется одним из битов поля типа сегмента данных). Поэтому в случае обычного расположения сегмента относительно базы: в направлении увеличения адресов, - смещение не должно превышать значения границы. Если же сегмент расположен в сторону уменьшения адресов (сегмент стека), то допустимые значения смещения должны быть больше границы.
Поле DPL – уровень привилегий дескриптора (descriptor privilege level) задает привилегию сегмента, определяющую возможности доступа к нему. Обратиться к сегменту может только такая программа, уровень привилегий которой не ниже (численно не больше) уровня привилегий сегмента.
Системные сегменты используются для хранения локальных таблиц дескрипторов (LDT) и состояний задач (TSS – task state segment) и имеют немного иной формат байта 5 прав доступа.
Кроме того, флаг S = 0 у дескрипторов так называемых шлюзов вызова, шлюзов задач, шлюзов прерываний и ловушек, которые используются для передачи управления программам, имеющим более высокий (меньший) уровень привилегий, что необходимо процессору для организации работы механизмов защиты. Поля базы и границы в таких дескрипторах фактически определяют адреса переходов (точек входа) в вызываемых сегментах.
Поскольку при обращениях к памяти с применением схемы сегментации приходится каждый раз вычислять адрес, используя базу сегмента и его границу, то извлечение их каждый раз из таблицы дескрипторов, расположенной в памяти, привело бы к существенным задержкам и снижению производительности ЭВМ. Поэтому каждый раз при замене содержимого сегментного регистра база и граница для нового сегмента аппаратно копируются в соответствующую программно недоступную пару регистров (базового адреса и границы сегмента), связанную с каждым сегментным регистром, и при последующих обращениях к данному сегменту берутся из этих регистров.
Страничный механизм
Как указывалось выше, страничный механизм в общей схеме управления многоуровневой памятью, в основном, решает задачи организации “виртуальной памяти”, упрощая управление и ускоряя обмен данными между уровнями памяти. Если сегменты связаны с логической организацией данных и процедур, относящихся к задачам, и могут иметь произвольную длину, то страницы имеют фиксированную длину и обеспечивают быстрое высвобождение места в памяти верхнего уровня (оперативной памяти) для новой информации, не требуя длительных пересылок в память нижнего уровня (жесткий диск) больших логических сегментов программ и данных.
Реализация страничного механизма опирается на использование таблиц страниц, описывающих расположение страниц в физической памяти. Обычно используется двухуровневая организация этих таблиц, что может быть обусловлено стремлением обеспечить косвенную привязку страниц к структуре данных задачи: в такой схеме принципиально возможно каждому сегменту задачи, сопоставить свою таблицу страниц, - или к совокупности одновременно выполняемых задач.
Представленный на рис. 3-1 (см. выше) страничный механизм рассматривает линейный адрес памяти, получаемый на выходе блока сегментации, как состоящий из трех частей:
номера строки каталога страниц (точнее каталога таблиц страниц), под который отведены 10 разрядов (с 22-го по 31-й) линейного адреса;
номера строки таблицы страниц, расположенного в разрядах 21:12 линейного адреса и
смещения физического в странице, задаваемого в младших 12 разрядах ([11:0]) линейного адреса.
Каталог 31 22 |
Таблица 21 12 |
Смещение 11 0 |
Первые две компоненты адреса используются для выборки информации из каталога (страниц) таблиц и таблицы страниц так, как показано на рис. 3-1. Номер строки каталога страниц добавляется к базовому адресу каталога, хранящемуся в управляющем регистре CR3 процессора. Этот адрес обязательно имеет нули в 12 младших разрядах, т.е. выровнен по границе 4K байт, которые и занимает каталог, содержащий 1024 строки по 4 байта. Адрес, полученный после сложения базового адреса каталога и десяти старших разрядов линейного адреса, указывает строку каталога страниц. Эта строка имеет следующий формат:
Адрес таблицы страниц [31:12] |
|
|
|
D |
A |
P CD |
P WT |
U/S |
R/W |
P |
Как видно, старшие разряды этой строки указывают на начальный адрес таблицы страниц, также выровненный по границе 4K байт – размеру таблицы страниц, имеющей такой же формат, как и каталог (таблиц) страниц.
При добавлении к этому адресу средних разрядов ([21:12]) линейного адреса получают адрес строки таблицы страниц, имеющей такой же вид, старшие разряды которой указывают адрес начала страницы в физической памяти.
Тогда физический адрес, соответствующий линейному адресу, получается добавлением смещения (младшие 12 разрядов линейного адреса) к физическому адресу страницы.
В младших разрядах строк каталога и таблиц страниц имеется несколько служебных разрядов, три из которых используются для управления пересылками страниц между уровнями памяти, это разряды:
- присутствия страницы (в случае строки каталога – таблицы страниц) в оперативной памяти – бит P (present), единичное значение которого говорит о присутствии соответствующей компоненты в оперативной памяти ;
- признака доступа к странице, устанавливающийся в единицу, если имело место чтение или запись по адресу, полученному с помощью данной строки – бит A (accessed); этот признак обычно используется для управления очередностью замещения страниц в оперативной памяти);
- признак выполнения операции записи по адресу, полученному с помощью данной строки – бит D (dirty); единичное значение этого признака говорит о том, что в соответствующую страницу выполнялась запись, и при удалении из оперативной памяти ее следует переписать на диск.
Бит PWT (page write through – сквозная запись) определяет режим записи при кэширования (обратная или сквозная), а бит PCD (page cache disable – выключение кэша страницы) управляет разрешением кэширования страниц.
Наконец биты U/S (user/supervisor – пользователь/система) и R/W (read/write) определяют разрешенный тип доступа к странице: уровень привилегий при доступе и режим- чтение или запись.
Также как и в случае сегментного механизма формирование физического адреса предполагает использование информации (адресов начала таблицы страниц и самих страниц) из таблиц, расположенных в оперативной памяти. Чтение информации из этих таблиц при каждом обращении втрое увеличило бы его время, поэтому необходим некоторый способ, позволяющий обойтись без непосредственного использования при каждом доступе к оперативной памяти. Но дополнительными скрытыми регистрами, как при сегментации, уже не обойтись. В страничном механизме для этой цели используется специальная небольшая ассоциативная память. Ее называют буфером трансляции адресов - TLB (translation lookahead buffer или translation location buffer).
В этой памяти объемом обычно до нескольких строк хранят результаты последних преобразований адресов в нескольких различных страницах. Формат строки (ячейки такой памяти) без служебной информации имеет следующий вид
Каталог |
Таблица |
Физический адрес страницы |
При вычислении физического адреса пара полей Каталог и Таблица преобразуемого линейного адреса, рассматриваемая как аргумент поиска в ассоциативной памяти, сначала ищется в буфере TLB. Если такая пара присутствует в TLB, то значение физического адреса страницы выбирается из найденной строки TLB. В противном случае преобразование (трансляция) логического адреса в физический производится с помощью каталога и таблицы страниц, хранящихся в оперативной памяти. Результат преобразования помещается в буфер TLB, так как ближайшие последующие обращения с большой вероятностью будут выполняться к той же самой странице.
Функции и основные характеристики систем прерывания программ
Работа ЭВМ или системы может быть представлена в виде одной или нескольких последовательностей событий, происходящих как внутри, так и вне нее, на которые система должна реагировать. К таким событиям относятся выполнение операций в процессоре, работа периферийных устройств, изменение состояния управляемых объектов и т.д.
Многопрограммный режим работы ЭВМ требует наличия в машине средств, позволяющих, при возникновении определенных условий, прекращать работу какой-либо из ее подсистем над исполняемой программой и выполнять какие-либо действия, обеспечивающие реакцию на возникшие условия. Обычно эти действия выполняются под управлением некоторых программ, выбор которых зависит от характера возникшей ситуации. Кроме того, прекращение ранее исполняемой программы, как правило, предполагает возможность ее последующего возобновления и использования промежуточных результатов ее работы, полученных программой до момента прекращения.
Управление названными действиями по переключению программ в многопрограммном режиме возлагается на систему прерывания программ ЭВМ.
Эта система представляет собой комплекс аппаратных и программных средств, предназначенных для обеспечения оперативной реакции на такие события внутри ЭВМ (системы) или вне ее, которые либо имеют асинхронный характер, по отношению к процессам, протекающим в самой ЭВМ, либо моменты их наступления трудно предсказуемы. Такие события могут быть программно определяемыми (возникающими непосредственно в результате выполнения команд программы) и программно независимыми.
Прерывание программы есть определенная совокупность действий, производимых ЭВМ с целью временного прекращения выполнения текущей программы при возникновении определенных событий, и передачи управления программам, специально предназначенным для обработки таких событий. Программа, выполнение которой прекращается, далее будет называться прерываемой (или, иногда, текущей), а программа, которой передается управление при прерывании – прерывающей.
Сигнал о (программно независимом) событии, требующем прерывания, обычно называют запросом прерывания (в англоязычной литературе – Interrupt Request, откуда и происходит используемое в ПЭВМ сокращение IRQ). В отличие от него, программно определяемые события, часто имеют иные названия, например, в ПЭВМ говорят об исключениях, переход к обработке которых осуществляется немного иначе, чем для запросов прерываний. Кроме того, существуют, так называемые, программные прерывания, которые представляют собой программный вызов системных (стандартных) функций.
Временную диаграмму процесса прерывания для поступающего запроса можно представить так, как показано на рис. 4.1.
Рис.4.1. Временнáя диаграмма прерывания (Прог 1 – прерываемая программа, ЗПр – запрос прерывания, Прог 2 – прерывающая программа, tр – время реакции на запрос, tз – время запоминания состояния , tв – время восстановления состояния)
Здесь обрабатываемая программа Прог 1 прерывается поступившим запросом прерывания. Прекращение ее выполнения происходит с определенной задержкой, связанной с завершением некоторых текущих действий и выяснением возможности поступившего запроса вызвать прерывание исполняемой программы. Затрачиваемое на это время названо временем реакции, обозначенным через tр. Источников запросов прерываний в ЭВМ, как правило, несколько, поэтому на данной фазе может возникнуть задача выбора для обработки одного из запросов.
После прекращения выполнения текущей программы начинается запоминание ее состояния, на которое затрачивается время запоминания состояния tз, показанное на рис.4 относительно большим. Время запоминания может включать в себя как аппаратные действия, выполняемые системой, так и программные действия, включенные в начальную часть программы обработки запроса, что происходит уже после передачи управления процессором собственно программе Прог 2 обработки ситуации, соответствующей поступившему запросу. По завершении программы обработки за время tв (которое может включать в себя и заключительные операции программы Прог 2) восстанавливается состояние ранее прерванной программы Прог 1, после чего возобновляется ее выполнение.
Таким образом, основные функции системы прерываний, соответствующие перечисленным этапам, сводятся к следующим:
1. Прием запросов прерываний (с учетом их приоритетов при наличии нескольких запросов, требующих обработки).
1а. Выбор на обслуживание запроса с наивысшим приоритетом
1б. Учет и управление приоритетом программ по отношению к запросам прерываний.
2. Прекращение выполнения текущей программы (с запоминанием ее состояния) и вход в прерывающую программу.
2а. Определение возможности прекращения выполнения текущей программы и выбор момента ее прекращения.
2б. Запоминание состояния прерываемой программы.
2в. Определения программы, которая должна быть вызвана для обслуживания запроса, и местоположения ее в памяти ЭВМ.
2г. Передача управления прерывающей программе и ее выполнение.
3. Возврат к прерываемой программе по завершении выполнения прерывающей.
3а. Восстановление состояния прерванной программы
3б. Передача управления прерванной программе (на точку прерывания).
Для оценки системы прерываний используют следующие характеристики:
1. Время реакции tр – время между появлением запроса прерывания и началом выполнения первой команды прерывающей программы. Для запросов одного и того же типа в одной и той же системе задержки (и, следовательно, время реакции) могут быть различны и зависеть от того, сколько еще запросов ожидают обслуживания и какие программы выполняются в момент их поступления. Поэтому время реакции обычно оценивается по наиболее важным (приоритетным) запросам, обрабатывающимся в первую очередь.
2. Время обслуживания прерывания tоб – время, затрачиваемое на запоминание и восстановление состояния прерываемой программы. В простейшем случае это время, затрачиваемое аппаратурой на переключение между программами, при переходе от прерываемой программы к прерывающей tоб = tз + tв.
Конечно, программная составляющая времени запоминания и восстановления может существенно превосходить аппаратную и варьироваться по времени. Поэтому во время обслуживания целесообразно включать только время выполнения аппаратных переключений и стандартных программных действий, если таковые имеются.
3. Количество типов (классов) прерываний – количество различных по способу обработки или по характеру источников типов прерываний, имеющихся в системе.
4. Количество входов запросов прерываний – количество аппаратных линий (шин), на которые могут поступать запросы прерываний. Эта характеристика определяет количество устройств, которые можно подключить к системе, не используя специальных средств мультиплексирования для входов прерываний (как это сделано в ПЭВМ с прерываниями для устройств, подключаемых по шине PCI).
5. Тип системы прерывания по отношению к способу определения причины прерывания, характеризующий способ, которым определяется источник запроса прерывания и местоположение сопоставленной ему программы обработки. Обычно, по этому параметру различают:
- опросные системы, в которых источник запроса прерывания определяется поочередным опросом всех возможных источников запросов;
- векторные системы, в которых источник запроса прерывания идентифицируется либо входом, к которому он подключен, либо кодом, который он передает в процессор;
- системы с классами прерываний, в которых все источники запросов сгруппированы по классам, в рамках которых может выполняться опросное или аналогичное векторному определение причины прерывания.
6. Глубина прерывания – максимальное количество программ, которые могут прерывать друг друга (вложенных прерываний).
Система может быть организована так, что прерывание любой прерывающей программы будет запрещено. В этом случае говорят о глубине прерывания, равной 1. Если допускается прерывание любой прерывающей программы, то говорят о неограниченной глубине прерывания. Возможны и какие-либо промежуточные варианты.
Увеличение глубины прерывания, в общем случае уменьшает время реакции системы, так как позволяет, приняв один запрос, не выполнять до конца (или вовсе отложить) его обработку, а обеспечить выполнение других запросов.
Порядок выполнения прерываний
Выше указано, что процесс прерывания, осуществляется за несколько шагов. Если считать, что запрос прерывания уже выбран и прерывание текущей программы разрешено, то на первом этапе система должна определить допустимый момент прерывания текущей программы.
Наиболее распространенным вариантом является прерывание по окончании выполнения текущей команды. Однако при этом должно учитываться также и то, какое действие вызвало необходимость прерывания. Если, например, исполняемая команда пытается обратиться к не принадлежащей текущей (прикладной) программе области памяти или выполнить какую-либо системную команду, запрещенную для прикладных программ, то ожидать окончания исполнения такой команды нельзя. В этом случае следует блокировать недопустимые действия команды, не дожидаясь ее завершения.
После приема запроса прерывания и окончания выполнения текущей команды начинается этап запоминания состояния прерываемой программы.
Запоминаемая информация должна полностью обеспечить возможность последующего возобновления выполнения прерываемой программы с той точки, в которой она прервана. К такой информации, в первую очередь, относится содержимое счетчика команд, указывающего на исполняемую (или следующую за ней в памяти) команду, а также содержимое регистра флагов (для того, чтобы, в случае прерывания перед командой условного перехода, можно было правильно выполнить переход после возобновления программы).
Однако имеется и иная относящаяся к прерываемой программе информация, без которой будет невозможно корректное возобновление ее выполнения. К такой информации относятся содержимое регистров процессора, установленное прерываемой программой, служебная информация, (маски, пороги), определяющая возможности прерывания данной программы, управляющая информация, задающая особенности текущего режимы работы ЭВМ, а также другая информация (например, в ПЭВМ, карта ввода-вывода).
Состояние прерываемой программы в момент прерывания сохраняется в памяти ЭВМ. Конкретное место (адреса) памяти, в котором сохраняется информация о состоянии, может определяться по-разному, причем, это может быть и не одна область памяти.
Количество запоминаемой информации может быть довольно большим, и время ее запоминания может заметно сказываться на производительности ЭВМ. Поэтому при прерывании стараются сохранить только минимально необходимую в каждом конкретном случае информацию, а само запоминание состояния организуют как аппаратными, так и программными средствами. Конечно, полностью аппаратный вариант более быстрый, но и более сложный. Поэтому, как правило, часть информации о состоянии запоминается аппаратно, а часть – программно.
Место в памяти для аппаратно запоминаемой информации о состоянии может определяться различным способом, но для обеспечения возможности “вложенности” прерываний (новое прерывание может прервать обработку предыдущего) удобно использовать стек, хотя использовались и другие варианты
Программно запоминаемая информация о состоянии также может сохраняться либо в стеке (командами записи регистров в стек в начале тела обработчика прерывания), либо в специальных сегментах состояния прерываемой задачи.
Собственно переход к прерывающей программе заключается в передаче ей управления (загрузкой начального ее адреса в счетчик команд).
Основной задачей на этом этапе является определение того, где в (оперативной) памяти располагается программа обработки того вида запросов прерываний, к которому относится запрос, вызвавший обрабатываемое прерывание. Иногда в этой процедуре предусматривается и этап уточнения того, какое именно устройство выставило обрабатываемый запрос. Такой этап называют определением причины прерывания.
Определение причины прерывания зависит от особенностей организации системы. Для этой цели может использоваться как программные, так и аппаратные приемы.
Программное определение причины прерывания является наиболее просто реализуемым вариантом, при котором, все запросы прерывания могут поступать на один общий вход, а для их обработки вызывается одна и та же обрабатывающая программа. Эта программа, сохранив необходимую информацию о состоянии, в начале своего выполнения поочередно опрашивает все возможные источники (устройства, которые могут выставить запросы) прерывания. Обнаружив устройство, запросившее прерывание, программа переходит к подпрограмме, предназначенной для обработки этого типа запроса. Такой способ определения причины прерывания прост в реализации, но достаточно медленен, особенно, при большом количестве источников прерываний.
При аппаратном определении причины прерывания каждому входу, на который может поступать запрос прерывания, или однородной группе таких входов ставится в соответствие (жестко или перенастраиваемо) ячейка памяти или строка таблицы, в которых указаны начальные адреса программ-обработчиков соответствующих запросов прерываний. Причем, если программа вызывается для группы (класса) запросов, то она определяет конкретный источник прерывания, анализируя состояние входов группы.
Использовался и несколько иной способ аппаратного определения причины прерывания, при которой сигнал опроса возможных источников прерываний подавался на линию, проходящую последовательно через все устройства. Первое из устройств, подключенных к этой линии, выставившее запрос прерывания, получив сигнал опроса, блокировало его дальнейшее прохождение по линии опроса к следующим устройствам и выдавало на шину данных свой номер или индивидуальный код, указывающий, какой именно источник выставил запрос.
После определения причины прерывания и передачи управления программе обработки запроса выполняется собственно обработка запроса, по завершении которой осуществляется возврат к ранее прерванной программе.
Такой возврат производится посредством восстановления состояния этой программы, существовавшего на момент прерывания, и передаче управления той ее команде, перед которой (или на которой, в зависимости от способа завершения последней команды в момент прерывания) она была прервана.
Процедура восстановления состояния обратна его запоминанию и производится теми же средствами: программно сохраняемая информация о состоянии восстанавливается программно, аппаратно сохраняемая – аппаратно. Поэтому последние команды обработчика прерываний (или вызываемая ими процедура) восстанавливают программно сохраненную информацию (чаще всего, содержимое регистров, которые использовались обработчиком). Естественно, место, в котором запоминалась программно сохраняемая информация обработчику известно, поскольку, в большинстве случаев, эта информация самим обработчиком и сохранялась.
Своей самой последней командой обработчик запускает восстановление аппаратно сохраненной информации и загрузку содержимого счетчика команд, существовавшего в момент прерывания. Обычно, это специальные команды, например IRET – возврат из прерывания, или LOAD PSW – загрузка слова состояния программы. По этим командам содержимое счетчика команд, регистра флагов (и другая аппаратно сохраняемая информация) извлекаются из того места, где они сохранялись, и рассылаются в соответствующие узлы.
Собственно установкой содержимого счетчика команд, осуществляется возврат к ранее прерванной программе и возобновляется ее выполнение.
Приоритетное обслуживание прерываний
При наличии в системе различных источников, способных формировать запросы прерываний, приходится решать задачи установления очередности (приоритета) приема и обработки этих запросов. Основных таких задач две:
- определять очередность приема запроса прерываний при одновременном наличии в системе нескольких запросов (поступивших одновременно или, накопившихся в ожидании обслуживания);
- определять могут ли принятые запросы прерывать выполнение текущей программы.
В соответствии с этими задачами для запросов прерываний и программ можно определить две формы отношений приоритета: приоритет между запросами прерываний и приоритет между запросами прерываний и программами.
Принципы реализации двух этих форм приоритетов в ЭВМ различаются.
А) Способ задания приоритета и выбора запроса прерывания зависит от способа определения причины прерывания, рассмотренного выше.
Если причина прерывания определяется программно, посредством опроса возможных источников запросов, то их порядок опроса фактически и задает приоритет, поскольку при наличии нескольких запросов первым будет принят тот, который выставило устройство, опрошенное ранее остальных, выставивших запрос.
Если причина прерывания определяется аппаратно, то и для определения наиболее приоритетного запроса используются схемные методы. Здесь также возможны различные решения. Можно, например, использовать аппаратный аналог схемы последовательного опроса источников, поочередно проверяющий входы запросов прерываний.
Но чаще используется схема, так называемого, приоритетного шифратора, которая включает в себя цепочку блокировки менее приоритетных входов и шифратор номера запроса. Цепочка блокировки, иногда называемая также “искателем левой единицы” или “дейзи-цепочкой”, показана на рис. 4.2.
Рис.4.2. Схема выбора наиболее приоритетного запроса
Построить такую схему несложно, выписав основные соотношения между входными сигналами (запросами прерываний - ЗПр) и выходными сигналами – сигналами выбранных с учетом приоритетов запросов.
Ясно, что наиболее приоритетный запрос ЗПр0 проходит на выход при своем появлении независимо от остальных запросов, т.е., y0 = ЗПр0. Следующий по приоритету запрос ЗПр1 пройдет на выход при своем появлении только, если отсутствует запрос ЗПр0, т.е., y1 = ЗПр1 ¬ЗПр0. Для прохождения следующего запроса требуется отсутствие первых двух, т.е., y2 = ЗПр2 ¬ЗПр0 ¬ЗПр1 = ЗПр2 ¬(ЗПр0 v ЗПр1). Понятно, что в общем случае можно записать yi = ЗПрi ¬(ЗПр0 v ЗПр1 v … v ЗПрi-1). Эти соотношения и реализует схема, показанная на рис.8.
Приоритетный шифратор представляет собой обычный шифратор, к входам которого подключены выходы рассмотренной цепочки, при этом он будет формировать номер выбранного цепочкой запроса.
Аппаратные схемы приоритетного выбора срабатывают быстро (при количестве входов запросов до нескольких десятков). Однако приоритет задан жестко и определяется подключением к входам.
Б) При задании приоритетов между запросами прерываний и программами используются механизм масок и механизм порогов.
Механизм масок позволяет каждой программе указать отдельно для каждого запроса прерывания может ли этот запрос прервать данную программу. Для этой цели используется двоичный код, называемый маской программы или маской прерывания, с разрядностью соответствующей количеству входов запросов прерываний, для которых требуется разрешать или запрещать прерывания. Каждому входу прерывания ставится в соответствие определенный разряд маски, установка которого в маске программы (прерывания) в единицу (в некоторых системах, наоборот, в нуль) запрещает запросам прерываний, поступающим на этот вход, прерывать данную программу.
Код маски хранится в специальном регистре, в который он устанавливается либо специальными командами, либо общими командами ввода-вывода, которые могут адресовать данный регистр как устройство.
Механизм порогов устроен похожим образом. Каждой программе присваивается некоторое целое число – код уровня. Прервать программу могут только те запросы, номер которых меньше уровня программы. Для реализации этого механизма используется схема сравнения, на входы которой подается номер выбранного запроса и код уровня выполняемой программы.
Следует отметить, что и код маски и номер уровня программы, относятся к информации о состоянии программы, сохраняемой при ее прерывании.