Обработка всех прерываний и особых случаев в процессорах фирмы Intel производится, в общем, одинаково и состоит из двух основных этапов. На первом из них процессор выполняет некоторые «рефлексивные» операции, которые одинаковы для всех прерываний и особых случаев и которыми программист управлять не может. На втором этапе действует созданный программистом обработчик прерывания или особого случая. Прерывания и особые случаи распознаются на границах команд и программист может не заботиться о состояниях внутренних рабочих регистров и устройств конвейера. Все служебные действия процессор производит автоматически.
Самое первое действие процессора при распознавании прерывания или особого случая заключается в идентификации его источника. Всем таким источникам назначается идентифицирующий номер от 0 до 255, иногда называемый вектором, который позволяет процессору выбрать нужный обработчик.
При восприятии аппаратного прерывания процессор выполняет два специальных цикла шины подтверждения прерывания и прерывающее устройство передает номер прерывания как байт данных. Немаскируемому прерыванию NMI назначен фиксированный номер 2 и не требуются циклы шины подтверждения прерывания.
По номеру процессор выбирает один из 256 обработчиков прерывания, обращаясь к таблице векторов прерываний, находящейся в памяти. Эта таблица состоит из четырехбайтных элементов и начинается с нулевого физического адреса памяти, занимая максимум 1 Кбайт. Каждый элемент таблицы представляет собой полный указатель селектор:смещение точки входа обработчика прерывания. Векторы прерываний должны иметь номера от 32 до 255, т.к. номера 0 – 31 зарезервированы фирмой Intel.
ОБРАБОТКА АППАРАТНЫХ ПРЕРЫВАНИЙ. Обработку прерывания, соответствующего номеру n, можно инициировать аппаратно или программно. Когда процессор 8086 распознает активный сигнал (высокий уровень) на входе INTR и прерывания разрешены (IF = 1), он выполняет следующие действия:
1. Вводит номер n от программируемого контроллера прерываний (обычно это микросхема 8259А), производя два цикла шины подтверждения прерывания.
2. Включает в стек содержимое регистра флажков FLAGS.
3. Включает в отек содержимое регистра CS.
4. Включает в стек содержимое регистра IP.
5. Сбрасывает в 0 флажок прерываний IF, запрещая восприятие дальнейших прерываний до явной установки в 1 флажка IF командой STI.
6. По номеру n обращается к n-му элементу таблицы векторов и передает селектор в регистр СS смещение в регистр IP.
7. Начинает выполнение обработчика прерывания с точки входа, определяемой регистрами CS:IP.
Сохраненное в стеке содержимое регистров CS:IP образует адрес возврата. Когда обработчик прерывания заканчивает свои действия, он выполняет команду возврата из прерывания IRET и управление передается прерванной программе.
Когда на входе немаскируемого прерывания NMI распознается нарастающий фронт сигнала, процессор реализует приведенную выше последовательность действий за исключением действия 1. Здесь определять номер прерывания не нужно, так как немаскируемому прерыванию назначен фиксированный номер 2 (этим несколько ускоряется реакция процессора на сигнал о серьезной ситуации в системе).
Отметим, что в процессоре i486 последующие нарастающие фронты на входе NMI не воспринимаются до тех пор, пока не будет выполнена завершающая обработчик прерывания команда IRET. Этот прием предотвращает вложенные вызовы обработчика, когда сигнал на входе NMI «дрожит». Однако еще один нарастающий фронт сигнала NMI процессор запоминает и после выполнения команды IRET обрабатывает второй сигнал немаскируемого прерывания.
ОБРАБОТКА ОСОБЫХ СЛУЧАЕВ (ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ). Особый случай - это внутреннее событие, возникающее при невозможности выполнять следующую команду. Для особых случаев назначены фиксированные номера в диапазоне от 0 до 31. Процессор 8086 распознает всего пять особых случаев, а в процессоре i486 их значительно больше. Передача управления обработчику особого случая осуществляется, как и при восприятии аппаратного прерывания, через таблицу векторов прерываний.
Процессор реагирует на особые случаи всегда, независимо от состояния флажка прерываний IF, т.е. маскирование особых случаев невозможно, да и нежелательно. Реакция осуществляется на границах команд, и состояние процессора сохраняется таким, каким оно было до «виноватой» команды. В частности, регистры CS:IP адресуют команду (с учетом всех байт префиксов), вызвавшую особый случай. Следовательно, обработчик особого случая может исправить ситуацию и повторить выполнение (осуществить рестарт) преостановленной команды с помощью заключительной команды IRET.
81. Аппаратные средства сегментной организации памяти (на примере Intel).
В процессоре i486 применяется сегментированная модель памяти, которая отличается от линейной аппаратной модели. Для программы адресное пространство разделено на блоки смежных адресов, называемых сегментами, а программа может обращаться только к данным, находящимся в этих сегментах. Внутри сегментов применяется линейная адресация, которая осуществляется относительно начала сегмента, и физический адрес, ассоциируемый, например, с программным адресом 0, по существу, скрыт от программиста. Базовый адрес может быть любым, а размер сегмента варьируется от одного байта до всего адресного пространства в 4 Гбайт. Последний размер показывает, что с помощью 32-битного индекса можно «пройти» все адресное пространство, не модифицируя содержимого сегментного регистра.
Дескриптор сегмента. Каждый сегмент в работающей системе характеризуется специальной 8-байтной структурой данных, называемой дескриптором сегмента. В описание сегмента включается базовый адрес сегмента, размер сегмента, тип, уровень привилегий и дополнительная информация о состоянии. При создании дескриптора область адресного пространства определяется как используемая с учетом ограничений, содержащихся в дескрипторе. Число дескрипторов сегментов в системе практически не ограничивается. Если не описать область адресного пространства памяти дескриптором, соответствующий диапазон адресов оказывается недоступным и процессор отказывается обращаться к нему. Когда программа ошибочно или намеренно формирует такой недействительный адрес, процессор «перехватывает» виноватую команду до попытки считывания/записи по неопределенному адресу.
Базовый адрес. 32-битное поле базового адреса занимает байты 2, 3, 4 и 7 дескриптора. Оно определяет любой начальный адрес сегмента в линейном адресном пространстве 4 Гбайт. Именно этот адрес сформирует процессор при задании нулевого смещения.
Предел. 20-битное поле предела, которое называется еще границей сегмента, занимает байты 0 и 1, а также младшие четыре бита байта 6 дескриптора. Предел равен размеру сегмента в байтах минус 1 (но см. далее о гранулярности); можно также считать, что предел задает максимальное смещение в конкретном сегменте или последнюю адресуемую единицу в сегменте. 20-битное поле предела позволяет определить сегмент, размер которого не превышает 1 Мбайт. На самом деле это не так. Сегмент действительно ограничен 1М элементов, но размер элементов задает специальный бит гранулярности G или дробности (это бит 55 в байте 6 дескриптора сегмента) - элементами сегмента могут быть байты или страницы из 4 Кбайт. Т.о., сегмент с байтной гранулярностью (G = 0) измеряется в байтах и имеет максимальный размер 1 Мбайт, когда поле предела содержит 0FFFFFH. Сегмент со страничной гранулярностью (G = 1) измеряется в страницах и имеет максимальный размер 1М страниц, когда поле предела содержит 0FFFFFH; это соответствует 1М * 4К = 4 Гбайтам, т.е. всему линейному адресному пространству памяти процессора. В этом смысле термин «гранулярность» эквивалентен понятию разрешающей способности цифрового представления изображений.
Байт 5 содержит права доступа и наз. AR. Бит присутствия Р установлен в 1, когда описываемый дескриптором сегмент находится в физической памяти. Двухбитное поле уровня привилегий дескриптора DPL определяет уровень привилегий, ассоциируемый с той областью памяти, которую описывает дескриптор. Бит сегмента S в дескрипторах сегмента памяти всегда установлен в 1, а конкретное назначение описывается полем типа, если S=0, дескриптор описывает системный объект. Трехбитное поле типа TYPE определяет целевое использование сегмента, задавая допустимые в сегменте операции. Бит доступа А, авт-ки устанавливается в 1, когда осуществляется обращение к определяемому дескриптором сегменту памяти. Бит размера по умолчанию D обеспечивает совместимость с i286.
Дескрипторные таблицы. Чтобы процессор мог следить за информацией о сегментах, целесообразно собрать дескрипторы всех существующих в системе сегментов в одном месте. Такая область памяти называется дескрипторной таблицей. Она представляет собой массив из 8-байтных элементов - дескрипторов. Порядок размещения дескрипторов в таблице не играет роли, а максимальное число дескрипторов составляет 8192. В процессоре предусмотрено использование дескрипторных таблиц трех типов, поэтому при создании сегментов приходится определять, в какую из таблиц поместить его дескриптор. Выбор таблицы зависит от целевого назначения сегмента.
Глобальная дескрипторная таблица GDT. Является главной общесистемной таблицей дескрипторов. Все программы (задачи), выполняющиеся в системе, могут использовать эту таблицу для обращения к сегментам памяти. Для локализации таблицы GDT предназначен специальный регистр GDTR, в котором находятся 32-битное поле линейного базового адреса таблицы и 16-битное поле предела с байтной грануляцией.
Дескрипторная таблица прерываний IDT. Также является общесистемной. Она содержит дескрипторы специальных системных объектов (напомним про бит S=0 в дескрипторе). Эти объекты называются шлюзами и определяют точки входа процедур обработки прерываний и особых случаев. Таблица IDT служит заменой таблицы векторов прерываний процессора 8086. Для локализации таблицы IDT служит системный регистр IDTR, формат которого аналогичен формату регистра GDTR.
Локальная дескрипторная таблица LDT. В мультизадачной системе для каждой задачи в дополнение к GDT можно построить свою LDT. Она определяет сегменты, доступные только этой конкретной задаче. Для локализации таблицы LDT предназначен 16-битный регистр LDTR, который содержит только селектор. Применение для таблицы LDT 16-битного селектора в отличие от 48-битных регистров GDTR и IDTR оказывается удобнее и обеспечивает более простые манипуляции таблицами LDT.
Селекторы сегментов: Двухбитное поле запрашиваемого уровня привилегий RPL не участвует в выборе дескриптора, а привлекается для контроля привилегий в механизме защиты. Бит индикатора таблицы TI показывает, из какой дескрипторной таблицы выбирается дескриптор: если TI = 0, обращение производится к GDT, а при TI = 1 – к LDT. Старшие 13 бит селектора, образующие поле индекса Index, определяют нужный дескриптор в дескрипторной таблице.
В микропроцессорах i8086/88 сегментация памяти осуществляется простым способом. Все адресное пространство в 1 Мбайт разбивается на несколько (от 16 до 65536) смежных блоков памяти. Каждый такой блок может иметь размер от 16 байт до 64 Кбайт и выравнивается на шестнадцатибайтной границе. Блок памяти длиной в 16 байт и выровненный на 16-ти байтной границе называется параграфом. Для обращения к любому адресу в памяти необходимо знать его физический адрес, который в микропроцессорах i8086/88 и реальном режиме работы микропроцессоров x86 совпадает с его линейным адресом.
В общем случае для формирования линейного адреса необходимо знать базу (Base, Segment) и смещение (Offset) этого адреса. В микропроцессорах i8086/88 оба компонента линейного адреса являются шестнадцатиричными.
Для микропроцессоров x86 в реальном режиме работы смещение (Offset) является одновременно эффективным адресом. Эффективные адреса формируются в Intel-совместимых микропроцессорах с помощью регистров данных. Эффективный адрес формируется следующим образом.: к восьми или шестнадцатиразрядному смещению в программе добавляется 16-ти разрядное содержимое базового регистра и 16-ти разрядное содержимое индексного регистра.
Примечания: 1. Разрядность смещения должна соответствовать разрядности регистра, куда пересылаются данные. 2. Обычно в базовом регистре содержится начальный адрес блока извлекаемых данных, а в индексном регистре -- длина извлекаемой записи, умноженная на порядковый номер (от 0 до N-1) записи.
Система команд в микропроцессорах x86 устроена так, что для образования эффективного адреса необходимо обязательное присутствие только одного его компонента. Таким образом любой компонент: база, индекс, смещение -- или даже оба из них могут быть опущены.
Примечание: Необходимые сочетания индексных, базовых регистров и разрядности смещения не произвольны, а резервируются фирмой Intel в своих разработках.
82. Вычисление физического адреса памяти при сегментной организации.
Для хранения таблиц GDT (GlobalDescriptorTable – глобальная таблица дескрипторов) и LDT (LocalDescriptorTable – локальная таблица дескрипторов) используется оперативная память. Для того, чтобы процессор смог найти в физической памяти таблицу GDT, ее полный 32-битный физический адрес (адрес начала таблицы), а также размер (поле в 16 бит) хранятся в специальном регистре процессора GDTR. Каждый дескриптор в таблицах GDT и LDT имеет размер 8 байт, поэтому максимальный размер этих таблиц - 64К (8*8К дескрипторов). Для извлечения нужного дескриптора из таблицы процессор складывает базовый адрес таблицы GDT из регистра GDTR со сдвинутым на 3 разряда влево (умножение на 8, в соответствии с числом байтов в дескрипторе) значением поля индекса из сегментного регистра и получает физический линейный адрес нужного дескриптора в физической памяти. Таблица GDT постоянно присутствует в физической памяти, поэтому процессор извлекает по этому адресу нужный дескриптор сегмента и помещает его во внутренний (программно недоступный) кэш-регистр процессора. (Таких регистров шесть и каждый из них соответствует определенному сегментному регистру, что значительно ускоряет работу процессора).
В случае, когда селектор указывает на таблицу LDT, виртуальный адрес преобразуется в физический аналогичным образом, но для доступа к самой таблице LDT добавляется еще один этап, так как в процессоре регистр LDTR указывает на размещение таблицы LDT не прямо, а косвенно. Сам регистр LDTR имеет размер 16 бит и содержит селектор дескриптора таблицы GDT, который описывает расположение этой таблицы в физической памяти. Поэтому при доступе к элементу физической памяти через таблицу LDT происходит двукратное преобразование виртуального адреса в физический, причем оба раза по описанной выше схеме. Сначала по значению селектора LDTR определяется физический адрес дескриптора из таблицы GDT, описывающего начало расположения таблицы LDT в физической памяти, а затем с помощью селектора задачи вычисляется смещение в таблице LDT и определяется физический адрес нужного дескриптора. Далее процесс аналогичен преобразованию виртуального адреса с помощью таблицы GDT.
Для получения физического адреса эффективный адрес (32 разряда) складывается с базовым адресом сегмента (32 разряда) из дескриптора как беззнаковые целые числа. Перенос из старшего разряда теряется. Полученное 32-хразрядное значение является линейным адресом. При отключенном страничном преобразовании линейный адрес является физическим. Таким образом в процессорах Intel максимальный размер физической памяти (пока) равен 4 гигабайта.
Прежде, чем складывать базу и эффективный адрес, процессор осуществляет проверки защиты (см. ниже). В случае нарушения условий защиты генерируется прерывание.
Таким образом, для использования чисто сегментного механизма микропроцессора Intel операционной системе необходимо сформировать таблицы GDT и LDT, загрузить их в память (для начала достаточно загрузить только таблицу GDT), загрузить указатели на эти таблицы в регистры GDTR и LDTR и выключить страничную поддержку. Если же операционная система не хочет использовать сегментную организацию виртуальной памяти, то ей достаточно создать таблицу дескрипторов из одного входа (дескриптора) и загрузить базовые значения сегмента в дескриптор. Виртуальное адресное пространство задачи будет состоять из одного сегмента длиной максимум в 4 Гбайта.
83. Страничная организация памяти (на примере Intel).
В процессоре i486 имеется внутреннее устройство страничного преобразования, базовым объектом памяти которого является блок фиксированного размера 4Кбайт, называемый страницей. Страничное преобразование адресов допускается программно разрешать и запрещать.
Устройство страничного преобразования модифицирует старшие 20 бит линейного адреса с привлечением двухуровневой системы таблиц. Первый уровень представлен каталогом страниц, а второй набором таблиц страниц. Каталог страниц локализует регистр управления CR3, в котором находится физический базовый адрес каталога, а таблицы страниц, сами являющиеся страницами, могут размещаться в памяти произвольно.
Структура страниц. При разрешенном страничном преобразовании адреса линейное адресное пространство 4 Гбайт процессора i486 подразделяется на 1М страниц по 4 Кбайт каждая. Физическая память также разделяется на страницы (их иногда называют страничными кадрами) с тем же размером 4 Кбайт. Пространство виртуальной памяти 4 Гбайт намного больше пространства 1 М - 16 Мбайт физически реализованной памяти. Следовательно, в любой момент времени только часть всех страниц виртуальной памяти присутствует в физической памяти. Отсутствующие в физической памяти страницы обычно хранятся во внешней памяти. Фиксированный размер всех страниц позволяет загрузить любую нужную виртуальную страницу в любую физическую страницу (в любой страничный кадр). В страничной организации памяти есть всего два уровня привилегий: уровень 3 считается ур. пользователя, а уровни 0,1 и 2 ур. супервизора.
Основой страничного преобразования выступает регистр управления CR3, который содержит 20-битный физический базовый адрес каталога страниц текущей задачи и называется регистром базового адреса каталога страниц - PDBR. Младшие 12 бит адреса считаются нулевыми, т. е. каталог выравнен по границе страниц. Предполагается, что каталог страниц постоянно находится в памяти и не участвует в свопинге.
Корневая таблица, называемая таблицей страниц первого уровня или просто каталогом страниц, содержит 1024 32-битных дескриптора, называемых элементами каталога страниц - PDE. Каждый из них адресует подчиненную таблицу страниц (таблицу страниц второго уровня), т.е. всего допускается до 1024 подчиненных таблиц страниц. Каждая из таблиц страниц содержит 1024 32-битных дескриптора, называемых элементами таблицы страниц - РТЕ, и каждый из элементов РТЕ, в свою очередь, адресует страничный кадр в физической памяти. Отметим, что наличие в каталоге страниц и таблице страниц по 1024 32- битных элементов определяет их размер точно в одну страницу.
Формат элемента таблиц страниц. Элементы PDE и РТЕ имеют одинаковый формат.
Адрес страничного кадра. В этом поле биты 12-31 находится физический базовый адрес страницы. Т.к. в физической памяти страницы таблиц выравнены по границам страниц, младшие 12 бит базового адреса считаются нулевыми. В элементе PDE адрес страничного кадра является адресом таблицы страниц. В элементе РТЕ адрес страничного кадра является адресом страницы, содержащей данные или команды.
Биты системного программиста. Процессор никогда не использует и не изменяет биты 9, 10 и 11. Разработчики операционных систем могут привлечь эти биты для хранения информации о частоте использования таблиц страниц.
Бит присутствия. Бит присутствия Р показывает, отображается ли адрес страничного кадра на страницу в физической памяти. Когда Р = 1, страница находится в памяти; Р = 0, страницы в памяти нет и остальная часть элемента таблицы страниц доступна для операционной системы, например для хранения информации о местонахождении отсутсвующей страницы. Если бит Р сброшен в 0 в каком-либо элементе (PDE или РТЕ), то при попытке использовать этот элемент для преобразования адреса возникает особый случай страничного нарушения. Т.к. в регистре управления CR3 нет бита Р, показывающего отсутствие в памяти каталога страниц, адресуемый регистром CR3, каталог страниц должен всегда находиться в физической памяти.
Биты обращения и грязный. Биты обращения A и грязный D содержат информацию об использовании страницы. Бит А сообщает об обращении для считывания или записи к странице или таблице страниц второго уровня, а бит D сообщает об обращении к таблице для записи. За исключением бита D в элементе каталога страниц эти биты устанавливаются в 1 автоматически; однако процессор самостоятельно не сбрасывает ни один из этих бит. Процессор устанавливает бит А в таблицах страниц обоих уровней до операции считывания или записи в таблицу. Процессор устанавливает в 1 бит D в элементе РТЕ до производства операции записи по адресу, определяемому этим элементом. Бит D в элементах PDE каталога не определен.
Сбрасывая в 0 бит D при загрузке страницы в память, операционная система может узнать о производстве записи в страницу. Если на диске есть копия страницы и к странице в памяти не было обращений для записи, передавать страницу из памяти на диск не нужно. Когда бит D = 1, при выборе страничного кадра на удаление из физической памяти его содержимое необходимо записывать на диск.
Биты считывание/запись и пользователь/супервизор. Биты R/W считывания/записи и U/S супервизор/пользователь применяются в механизме защиты применительно к страницам; контроль достоверности обращения осуществляется одновременно с преобразованием адреса.
Биты управления кэшированием. Биты PCD запрещения кэширования страницы и PWT сквозной записи применяются для управления кэшированием на уровне страниц. С их помощью программа может управлять кэшированием отдельных страниц.
Вычисление физического адреса при страничной организации.Если включено страничное преобразование, то линейный адрес, в свою очередь, воспринимается как виртуальный и преобразуется механизмом страничного преобразования в физический. Для реализации механизма управления страницами как физическое, так и виртуальное адресное пространства разбиты на страницы размером 4К. Всего в этих адресных пространствах насчитывается 1М страниц. Несмотря на наличие нескольких виртуальных сегментов, все виртуальное адресное пространство задачи имеет общее разбиение на страницы, так что нумерация виртуальных страниц сквозная.
Линейный виртуальный адрес содержит в своих старших 20 разрядах номер виртуальной страницы, а в младших 12 разрядах смещение внутри страницы. Для отображения виртуальной страницы в физическую достаточно построить таблицу страниц, каждый элемент которой - дескриптор виртуальной страницы - содержал бы номер соответствующей ей физической страницы и ее атрибуты.
Дескриптор страницы содержит 20-тиразрядное поле номера страницы, которое достаточно для определения физического адреса начала страницы, так как при ее фиксированном размере 4К младшие 12 разрядов этого адреса всегда равны нулю. Дескриптор страницы также содержит следующие поля, близкие по смыслу соответствующим полям дескриптора сегмента:
· P - бит присутствия страницы в физической памяти,
· W - бит разрешения записи в страницу,
· U - бит пользователь/супервизор
· A - признак того, был ли доступ к странице,
· D - признак модификации содержимого страницы,
Размер страницы в микропроцессорах Intel составляет 4К. При таком размере сама таблица страниц должна занимать 4 мегабайта.
Преобразование линейного виртуального адреса в физический происходит следующим образом. Поле номера виртуальной страницы (старшие 20 разрядов) делится на две равные части по 10 разрядов: номер дескриптора в каталоге и номер страницы в таблице страниц.
Защита Процессор находит дескриптор виртуальной страницы для таблицы страниц, складывая базовый адрес каталога из CR3 со смещением в каталоге, которое получается из номера, умноженного на 4 (дескриптор имеет размер 4 байта). В соответствии с атрибутами этого дескриптора определяются права доступа к этой странице, а также наличие ее в физической памяти. В случае ее отсутствия происходит страничное прерывание, и операционная система должна в этом случае переместить ее в память. После того, как нужная страница находится в памяти, для определения адреса элемента данных аналогичным образом используется смещение, определяемое номером страницы линейного виртуального адреса.
При доступе к странице в процессоре используется двухуровневая схема адресации страниц, что замедляет преобразование, но позволяет использовать страничный механизм и для хранения самой таблицы страниц, и существенно уменьшить объем физической памяти для ее хранения.
84. Защита памяти при сегментной организации.
Каждая ссылка к памяти контролируется с точки зрения удовлетворения защитным проверкам. Все проверки выполняются до начала цикла обращения к памяти; любые нарушения защиты предотвращают начало цикла доступа к памяти и генерируют исключение. Поскольку проверки защиты выполняются параллельно с трансляцией адреса, они не влияют на характеристики быстродействия системы. Вообще существует пять проверок:
a. Проверка типа
b. Проверка границы
c. Ограничение адресуемого домена
d. Ограничение точек входа в процедуру
e. Ограничение набора команд
Нас в, первую очередь, будут интересовать подробности первых двух.
Проверка типа может использоваться для определения программных ошибок, состоящих в попытке использования сегментов неправильным способом. Если эффективный адрес – это адрес стека, то селектор SS должен указывать на дескриптор с типом “стековый сегмент”. Селектор в DS должен попадать на дескриптор с типом «сегмент данных». При этом процессор рассматривает информацию о типе в двух возможных случаях:
Когда селектор для дескриптора загружается в сегментный регистр. Конкретные сегментные регистры могут содержать только конкретные типы дескрипторов; например:
· Регистр CS может быть загружен только селектором выполняемого сегмента.
· Селекторы выполняемых сегментов, не являющиеся "Доступными для чтения", не могут быть загружены в регистры сегментов данных.
· В регистр SS могут быть загружены только селекторы сегментов стека, "Доступных для записи".
· В регистре DS могут быть загружены селекторы сегментов данных.
Конкретные сегменты могут использоваться командами только конкретными, предопределенными способами; например:
· Никакая команда не может выполнять запись в выполняемый сегмент.
· Никакая команда не может выполнять запись в сегмент данных, если для него не установлен бит "Доступен для записи".
· Никакая команда не может выполнять чтение выполняемого сегмента, если для него не установлен бит "Доступен для чтения".
Нарушение этих условий влечет за собой генерацию прерывания по защите.
Поле границы дескриптора сегмента не дает программам выполнить адресацию вне сегмента. Действующее значение границы зависит от установки бита G (бит грануляции). Для сегментов данных граница также зависит от бита E (бит направления расширения сегмента).
Когда бит G очищен, граница сегмента равна значению 20-разрядного поля границы дескриптора. В этом случае граница может изменяться в диапазоне от 0 до 0FFFFFH (220-1, или 1 мегабайт). Это фактически означает, что максимальный эффективный адрес, вычисляемый процессором на основании метода адресации вкоманде, не может превышать 1 мегабайт.
Если бит G установлен, то процессор умножает значение поля границы на масштабный коэффициент 212. В этом случае граница будет изменяться в диапазоне от 0FFFH (212-1, или 4K), до 0FFFFFFFFH (232-1, или 4 гигабайта). Отметим, что при использовании такого масштабирования, проверка границы для младших 12 битов адреса не выполняется; когда бит G установлен, а граница сегмента равна 0, допустимые значения смещения в сегменте лежат в диапазоне от 0 до 4095.
Для всех типов сегментов, за исключением сегментов, расширяемых вниз (т.е. стековых сегментов), значение границы на единицу меньше размера сегмента в байтах. Процессор генерирует исключение общей защиты в любом из следующих случаев:
· попытка доступа к байту памяти по адресу, превышающему границу сегмента.
· попытка доступа к слову памяти по адресу, превышающему границу-1.
· попытка доступа к двойному слову памяти по адресу, превышающему границу сегмента - 3.
Для сегментов, расширяющихся вниз, граница служит для той же функции проверки, но интерпретируется иначе. В этом случае диапазон допустимых значений адреса определяется от (граница+1) до 232-1. Сегмент с расширением вниз имеет максимальный размер при значении границы, равном 0.
Контроль границы позволяет отлавливать такие программные ошибки, как неверно вычисленные индексы массивов и недопустимые указатели. Эти ошибки определяются сразу же, как только они произошли, поэтому идентификация вызвавшей их причины существенно упрощается. Без такого контроля границ указанные ошибки могут иметь следствием разрушение важных областей памяти в других модулях, а их существование невозможно обнаружить, пока не произойдет сбой в испорченном таким образом модуле, а такое событие может наступить намного позже, чем фактическая вызвавшая его ошибка. Защита позволяет блокировать такие ошибки и сообщить об их источнике.
В дополнение к проверке границ сегментов существует также проверка границ таблиц дескрипторов. Регистры GDTR и IDTR содержат 16-разрядное значение границы. Оно используется процессором для защиты программ от выбора дескриптора сегмента из области, лежащей вне данной таблицы. Граница таблицы дескрипторов идентифицирует последний допустимый байт этой таблицы. Поскольку каждый дескриптор имеет длину восемь байтов, таблица, содержащая до N дескрипторов, должна иметь значение границы, равное 8*N-1.
Дескриптору может быть задано нулевое значение. Это относится к первому дескриптору в таблице GDT, который не используется. Хотя этот дескриптор может быть загружен в сегментный регистр, любая попытка ссылки к памяти при помощи этого дескриптора приведет к генерации исключения общей защиты.
Проверка типа и проверка границы – это первых два эшелона защиты. После этих видов защит выполняется ещё проверка привилегий, которая составляет третий эшелон сегментной защиты. Это довольно сложный вид проверки, поэтому детально мы его рассматривать не будем. Надо только отметить, что при доступе к кодовому сегменту и выполнении привилигированной команды проверка уровня привилегий выполняется обязательно: любая привилигированная команда должна работать на уровне CPL=0 (это пятый вид защиты).
85. Аппаратные средства организации мультизадачного режима (на примере Intel).
Процессор i486 обеспечивает аппаратную поддержку мультизадачности. Задачей называется программа, выполняемая в текущий момент, либо ожидающая выполнения во время работы другой программы. Задача запускается прерыванием, исключением, переходом или вызовом. Когда одна из этих форм передачи управления используется с назначением, заданным элементом одной из дескрипторных таблиц, этот дескриптор может иметь тип, вызывающий начало выполнение новой задачи после сохранения состояния текущей задачи. Существует два типа задаче-ориентированных дескрипторов, которые могут находиться в таблице дескрипторов: дескрипторы сегмента состояния задачи и шлюзы задачи. Когда управление передается любому из таких дескрипторов. происходит переключение задачи.
Переключение задачи похоже на вызов процедуры, но оно выполняет сохранение большего количества информации о состоянии процессора. Вызов процедуры сохраняет только содержимое регистров общего назначение, а в некоторых случаях содержимое только одного регистра (ЕIР). При вызове процедуры содержимое сохраняемых регистров помещается в стек, чтобы процедура имела возможность вызвать сама себя (реентерабельность). Переключение задачи передает выполнение в полностью иную среду, среду задачи. Для этого требуется сохранить содержимое практически всех регистров процессора, таких как регистр EFLAGS. В отличие от процедур, задачи не реентерабельны. Переключение задачи ничего не помещает в стек. Информация о состоянии процессора сохраняется в структуре данных в памяти, которая называется сегмент состояния задачи. В число регистров и структур данных, поддерживающих мультизадачность, входят: сегмент состояния задачи, дескриптор сегмента состояния задачи, регистр задачи, дескриптор шлюза задачи. Используя эти структуры, процессор i486 может переключать выполнение с одной задачи на другую, сохраняя контекст текущей задачи. допуская тем самым рестарт другой задачи.
Сегмент состояния задачи.
Информация о состоянии процессора, необходимая для восстановления контекста задачи, хранится в типе сегмента, называемом сегментом состояния задачи, или TSS. Поля TSS делятся на две основные категории:
1. Динамические поля, обновляемые процессором при каждом переключении задачи. В число этих полей входят:
- Регистры общего назначения (ЕАХ, ЕСХ, EDX, ЕВХ, ESP, EBP, ESI и EDI).
- Сегментные регистры (ES, CS, SS, DS, FS и GS).
- Регистр флагов (EELAGS),
- Указатель команд (ЕIР),
- Селектор для TSS предыдущей задачи (обновляется только когда ожидается возврат).
2. Статические поля, которые процессор считывает, но не изменяет. Эти поля устанавливаются при создании задачи. Эти поля:
- Селектор для LDT задачи.
- Логический адрес для стеков привилегированных уровней 0, 1 и 2.
- Бит Т (бит отладочной ловушки), который, будучи установленным, заставляет процессор устанавливать при переключении задачи отладочное исключение.
- Базовый адрес битового массива разрешения ввода/вывода. При наличии, данный массив всегда хранится в TSS по старшим адресам. Базовый адрес указывает на начало массива.
Дескриптор TSS.
Сегмент состояния задачи, как и все прочие сегменты, определяется дескриптором. Бит "Занят" в поле Типа указывает на то, что задача занята. Занятой задачей называется текущая выполняемая или ожидающая выполнения задача. Поле Типа со значением 9 указывает на неактивную задачу, значение 11 (десятичное) указывает на занятую задачу. Задачи нереентерабельны. Процессор i486 использует бит Занятости для обнаружения попыток вызова задачи, выполнение которой прервано.
Доступ к дескриптору TSS не дает процедуре возможности читать или модифицировать дескриптор. Чтение и модификация его возможны только путем отображения в тот же адрес памяти дескриптора данных. Загрузка дескриптора TSS в сегментный регистр вызывает исключение. Дескрипторы TSS могут находиться только в таблице GDT. Попытка доступа к TSS при помощи селектора с установленным битом ТI (который обозначает текущую LDT) генерирует исключение.
Дескриптор шлюза задачи.
Дескриптор шлюза задачи обеспечивает косвенные, защищенные ссылки к задаче. DPL шлюза задачи управляет доступом к дескриптору для переключения задачи. Процедура не может выбрать дескриптор шлюза задачи до тех пор, пока RPL селектора и CPL процедуры не будут численно меньше или равны DPL дескриптора. Тем самым предотвращается переключение задачи менее привилегированными, чем она сама, процедурами. При использовании шлюза задачи DPL дескриптора TSS назначения не используется.
Процедура с доступом к шлюзу задачи может вызвать переключение задачи, как и процедура с доступом к дескриптору TSS. Как шлюзы задачи, так и дескрипторы TSS предназначены для решения следующих вопросов:
1.Необходимость иметь для задач только один бит Занятости. Поскольку этот бит хранится в дескрипторе TSS, каждая задача должна иметь только один такой дескриптор. Однако, может существовать несколько шлюзов задачи, выбирающих один дескриптор TSS.
2. Необходимость обеспечить селективный доступ к задачам. Шлюзы задачи позволяют решить эту проблему, т.к. они могут размещаться в LDT и иметь DPL, отличный от DPL дескриптора TSS. Процедура, недостаточно привилегированная для использования дескриптора TSS в GDT (который обычно имеет DPL равный 0), может тем не менее вызвать другую задачу, если она имеет доступ к шлюзу задачи в LDT. Благодаря шлюзам задачи операционная система может ограничить переключение задач конкретными задачами.
3. Необходимость выполнения переключения задачи в случае прерывания или особой ситуации. Если прерывание или исключение передает в шлюз задачи вектор, процессор i486 выполняет переключение на указанную задачу.
Реализация переключения задач.Сегмент состояния задачи, как и все прочие сегменты, определяется дескриптором. Формат дескриптора TSS показан на Рисунке