
ЭВУ 2 семестр / Презентации ЭВУ в пдф / метода моховикова
.pdf
Рис. 59.
Схема прове-
рок по соответ-
ствию уровней привилегий и процедура вы-
бора целевого
TSS при пере-
ключении за-
дач c использо-
ванием шлюза задачи
При использовании команд IRET, команды вызова прерываний, на-
пример, INT n или в случаях прерываний и ловушек, как прямое переключе-
ние задач, так и переключение задач с использованием шлюзов задач произ-
водится вне зависимости от значений, соответственно, DPLTSS или DPLШлTSS,
т. е. без проверок условий доступа по уровням привилегий.
11.10. Программное переключение
Операция переключения задач сохраняет состояние процессора (в TSS текущей задачи), и связь с предыдущей задачей (в TSS новой задачи) за-
гружает состояние новой задачи и начинает ее выполнение. Задача, вызывае-
мая по команде JMP, должна заканчиваться аналогичной командой обратного перехода.
151
В случае использования команды CALL возврат должен происходить по команде IRET, которая сохраняет контекст завершаемой задачи и загружает контекст прерванной.
Алгоритм работы команды IRET в случае возврата из прерывания и в случае обратного переключения задач различен и определяется значением флага NT (Nested Task). Если флаг сброшен, то выполняется обычный воз-
врат из прерывания (через стек). Если флаг установлен, то команда IRET
инициирует обратное переключение задач.
После загрузки компьютера флаг NT находится в установленном состоянии. Однако любое аппаратное прерывание или исключение сбрасыва-
ет этот флаг, в результате чего команда IRET, завершающая обработчик, вы-
полняется в «облегченном» варианте (возврат через стек).
То же происходит при выполнении процессором команды про-
граммного прерывания INT. Поскольку команда IRET восстанавливает ис-
ходное состояние регистра флагов, после завершения обработчика флаг NT
снова оказывается установленным (если, конечно, он не был явно сброшен выполняемой программой).
При выполнении процедуры переключения на новую задачу через шлюз или непосредственно через TSS, процессор сохраняет в TSS текущей задачи слово флагов и устанавливает в регистре флагов бит NT. Команда
IRET, завершающая задачу, обнаруживает NT = 1 и, вместо осуществления возврата через стек, инициирует механизм обратного переключения задач.
11.11. Последовательность действий при переключении задач
При переключении задачи процессор выполняет следующую последова-
тельность действий (рис. 60):
1)проверяет право на переключение по уровню привилегий CPL £ DPL;
2)сохраняет в TSS исходной задачи ее контекст;
3)загружает в регистр TR селектор TSS новой задачи;
152

4) в поле связи TSS новой задачи сохраняется селектор TSS исходной задачи, что обеспечивает возможность будущего обратного переключения.
Считывает контекст из TSS новой задачи (в CS:IP появляется точка входа в новую задачу). Флаг NT = 1. Переключение произошло.
5. Когда в новой исполняемой задаче встретится команда IRET, она бу-
дет выполняться как обратное переключение задач (NT = 1).
6.Контекст текущей задачи сохранится в ее TSS.
7.В регистр TR загрузится селектор TSS исходной задачи (из поля свя-
зи TSS текущей задачи).
8. Регистры восстановят контекст исходной задачи.
Рис. 60. Пример смены контекста
11.12. Регистр задачи TR
TR (Task Register) – это 16-разрядный системный регистр, который хранит селектор дескриптора TSS текущей задачи. Этот регистр также имеет теневую 64-разрядную компоненту, используемую только самим процессо-
ром, в которой хранится содержимое дескриптора TSS текущей задачи – это повышает производительность процессора.
153
Когда происходит переключение со старой задачи на новую, про-
цессор помещает в TSS новой задачи в поле Link содержимое регистра TR и
таким образом обеспечивает связь со старой задачей. После загрузки значе-
ний из TSS новой задачи, в регистр TR процессор записывает селектор деск-
риптора TSS этой новой задачи.
Для загрузки значения в регистр TR используется команда LTR,
единственным операндом которой служит 16-разрядный регистр общего на-
значения или переменная в памяти. Для чтения значения из этого регистра используется команда STR, которая также имеет один операнд – 16-
разрядный регистр общего назначения или переменную в памяти.
Команда LTR относится к привилегированным командам – она мо-
жет выполняться только на нулевом уровне привилегий. Команду STR мож-
но выполнить на любом уровне привилегий, так что любая программа или задача может прочитать значение этого регистра. Это может показаться странным – процессор позволяет прикладным задачам считывать «конфи-
денциальную» информацию – селектор дескриптора TSS, однако на самом деле информации значение TR программе не дает, потому что в этом регист-
ре находится селектор дескриптора TSS текущей задачи, и задача ничего с этим сделать не сможет – переключения на саму себя запрещены.
Регистр TR имеет, в основном, два применения:
1.Считывая значение TR, программа может определить текущую вы-
полняемую задачу. Это может пригодиться при отладке, например, для выво-
да на экран селектора дескриптора TSS текущей задачи, либо для тех обра-
ботчиков прерываний и исключений, которые не являются сами задачами и выполняются в контексте текущей задачи. Значение из TR позволяет опреде-
лить текущую задачу.
2. Для перевода процессора в режим мультизадачности необходима загрузка селектора в регистр TR.
154

; Main_TSS – это селектор не- |
; Main_TSS: |
|
|
||||||||
которого |
определенного |
дескриптора |
|
|
|
|
|
||||
TSS. |
|
|
|
|
|
|
; |
А |
теперь процессор |
загрузил |
|
|
|
|
|
|
|
|
те же самые значения из TSS в регист- |
||||
mov |
ax,Main_TSS |
|
|
|
ры. |
|
|
|
|
||
ltr |
ax |
|
|
; |
|
|
; Теперь процессор в режиме муль- |
||||
Загружаем в регистр TR селектор |
|
|
тизадачности. |
|
|
|
|||||
|
|
|
|
; |
деск- |
|
|
|
|
|
|
риптора TSS задачи Main. Теперь теку- |
; |
Установка Busy flag |
Main_TSS |
||||||||
щая |
|
|
|
|
|
|
- она нужна, потому что был переход с |
|
|||
; задача – это Main_TSS. |
|
|
|
; Main_TSS на Main_TSS командой |
|||||||
; Чистим Busy flag Main_TSS - он |
JMP - эта команда сбрасывает флаг за- |
||||||||||
установился после загрузки селектора в |
нятости |
|
|
|
|
||||||
TR |
|
|
|
|
|
|
; старой задачи, т. е. Main_TSS. |
|
|||
mov |
bx,offset |
GDT |
|
+ |
|
|
|
|
|
||
Main_TSS |
|
|
|
|
|
|
|
mov |
bx,offset |
GDT |
+ |
and |
byte |
ptr |
[ |
bx |
+ |
5 |
Main_TSS |
|
|
|
|
],11111101b |
|
|
|
|
|
|
|
or |
byte ptr [ bx + 5],10b |
|
|
; Переход на Main_TSS |
|
|
|
|
|
|
|
|
|||
db |
0eah |
; |
Этот |
код |
эк- |
|
|
|
|
|
|
вивалентен команде FAR JMP Main_TSS:00 |
|
|
|
|
|
||||||
dw |
00 |
|
|
|
|
|
|
|
|
|
|
dw |
Main_TSS |
|
|
|
|
|
|
|
|
|
; Вот здесь процессор сохранил контекст текущей задачи, т. е. запол-
нил
; поля TSS текущими значениями.
Пример 1. Загрузка селектора в дескриптор |
Пример 2. Реализация многозадачности |
Рис. 61. Работа с регистром задачи
Для того чтобы понять, как именно это делается, рассмотрим следую-
щие примеры – причем так, что второй пример будет логическим продолже-
нием первого (рис. 61). При загрузке регистра TR в дескрипторе TSS задачи устанавливается флаг занятости B. Загрузка этого регистра связывает теку-
щее состояние процессора с контекстом данной задачи.
155
11.13. Задачи и флаги
Для управления задачами процессор использует несколько флагов:
Флаг занятости B (Busy) – находится в дескрипторе TSS, в байте прав доступа. Устанавливается всякий раз, когда происходит переключе-
ние на задачу, и когда он установлен, это означает, что задача занята. Пе-
реключение на занятую задачу запрещено, и этот флаг предназначен для предотвращения рекурсивного вызова задачи. Флаг занятости сбрасывает-
ся при переключении на другую задачу командами FAR JMP либо IRET;
при переключении командой FAR CALL либо при прерывании (даже если обработчик прерывания – тоже задача) флаг не сбрасывается.
Флаг трассировки T – находится в сегменте состояния задачи TSS,
это 0-й бит по смещению 64h в TSS. Если флаг установлен, то при пере-
ключении на задачу процессор сначала загрузит значения из всех полей
TSS, проверит их правильность и, если не обнаружит нарушений, сгене-
рирует исключение отладки (прерывание 1). Если флаг сброшен, то при переключении на задачу исключение отладки не генерируется. Этот флаг предназначен для отладки задач и также может применяться для явного системного дополнения контекста задачи, например, для загрузки регист-
ров FPU.
Флаг NT (Nested Task) – находится в регистре EFLAGS. Если пере-
ключение на новую задачу было вызвано командой FAR CALL либо ста-
рая задача была прервана исключением или прерыванием и его обработ-
чик также является задачей, то флаг NT устанавливается в регистре
EFLAGS новой задачи. Благодаря этому новая задача может вернуть управление старой задаче командой IRET. Команда IRET выполняет одно из двух действий: если NT = 0, то производит обычный возврат из преры-
вания; если NT = 1, то производит переключение на предыдущую задачу,
селектор дескриптора TSS которой находится в поле Link в TSS текущей задачи.
156
Флаг TS (Task Switched) – находится в регистре управления CR0.
Этот флаг устанавливается каждый раз, когда процессор переключается на задачу и служит индикатором переключения задач.
Таблица 5
Воздействие при переключении задачи на флаги Busy, NT, TS и поле
Link
|
Флаг или по- |
|
Эффект от ко- |
|
Эффект от ко- |
|
Эффект от ко- |
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
||
|
ле |
|
|
манды JMP |
|
манды |
CALL |
или |
|
манды IRET |
|
||
|
|
|
|
|
|
|
прерывания |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
||||
|
Флаг B (Busy) |
|
Установлен. |
|
Установлен. |
|
Не |
меняется. |
|
||||
|
новой задачи |
|
|
Перед |
переходом |
|
Перед |
вызовом |
|
Перед |
возвратом |
|
|
|
|
|
|
должен |
быть сбро- |
|
должен быть сбро- |
должен быть уста- |
|
||||
|
|
|
|
|
|
||||||||
|
|
|
|
шен. |
|
|
шен. |
|
|
|
новлен. |
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
Флаг B старой |
|
Сбрасывается. |
|
Не |
меняется, |
|
Сбрасывается. |
|
||||
|
задачи. |
|
|
|
|
|
он уже установлен |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
||||
|
Флаг NT |
но- |
|
Не меняется. |
|
Устанавлива- |
|
Восстанавли- |
|
||||
|
вой задачи |
|
|
|
|
|
ется. |
|
|
|
вается из TSS новой |
|
|
|
|
|
|
|
|
|
|
|
|
|
задачи. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
Флаг NT |
ста- |
|
Не меняется. |
|
Не меняется. |
|
Сбрасывается. |
|
||||
|
рой задачи |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
Поле Link но- |
|
Не меняется. |
|
Загружается |
|
Не меняется. |
|
|||||
|
вой задачи. |
|
|
|
|
|
селектором |
TSS |
|
|
|
|
|
|
|
|
|
|
|
|
старой задачи. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
||||
|
Поле |
Link |
|
Не меняется. |
|
Не меняется. |
|
Не меняется. |
|
||||
|
старой задачи. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
Флаг TS в ре- |
|
Устанавлива- |
|
Устанавлива- |
|
Устанавлива- |
|
|||||
|
гистре CR0. |
|
|
ется. |
|
|
ется. |
|
|
|
ется. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
При попытке выполнить команды FPU, MMX или XMM процессор мо-
жет генерировать исключение неприсутствующего устройства (#NM – пре-
рывание 7), что позволяет системе выполнить смену контекста FPU, MMX и
XMM.
157

Процессор позволяет пользоваться режимом виртуального 8086 только в контексте задачи, и этот режим добавляет некоторые другие флаги, с кото-
рыми взаимодействует процессор в задаче, но такой режим процессора до-
вольно сложный и пока мы его рассматривать не будем.
Взаимодействие задач с флагами приведено в табл. 5.
12. Страничное управление памятью
Страничное управление (Paging) является средством организации вирту-
альной памяти с подкачкой страниц по запросу (Demand-Paged Virtual Memory). В отличие от сегментации, которая организует программы и дан-
ные в модули различного размера, страничная организация оперирует с па-
мятью как с набором страниц одинакового размера (рис. 62).
Рис. 62. Странич-
ная организация памя-
ти
В момент обращения страница может присутствовать в физической опе-
ративной памяти, а может быть выгруженной на внешнюю (дисковую) па-
мять.
В самом простом и наиболее распространенном случае страничной ор-
ганизации памяти как логическое адресное пространство, так и физическое представляются состоящими из наборов блоков или страниц одинакового
158
размера. При этом образуются логические страницы (page), а соответствую-
щие единицы в физической памяти называют физическими страницами или страничными кадрами (page frames). Страницы (и страничные кадры) имеют фиксированную длину, обычно являющуюся степенью числа 2, и не могут перекрываться. Каждый кадр содержит одну страницу данных. При такой ор-
ганизации внешняя фрагментация отсутствует, а потери из-за внутренней фрагментации, поскольку процесс занимает целое число страниц, ограниче-
ны частью последней страницы процесса.
Логический адрес в страничной системе – упорядоченная пара (p, d), где p – номер страницы в виртуальной памяти, а d – смещение в рамках страни-
цы p, на которой размещается адресуемый элемент. Заметим, что разбиение адресного пространства на страницы осуществляется вычислительной систе-
мой незаметно для программиста. Поэтому адрес является двумерным лишь с точки зрения операционной системы, а с точки зрения программиста адрес-
ное пространство процесса остается линейным.
Описываемая схема позволяет загрузить процесс, даже если нет непре-
рывной области кадров, достаточной для размещения процесса целиком. Но одного базового регистра для осуществления трансляции адреса в данной схеме недостаточно. Система отображения логических адресов в физические сводится к системе отображения логических страниц в физические и пред-
ставляет собой таблицу страниц, которая хранится в оперативной памяти.
Иногда говорят, что таблица страниц – это кусочно-линейная функция ото-
бражения, заданная в табличном виде.
Интерпретация логического адреса показана на рис. 63. Если выполняе-
мый процесс обращается к логическому адресу v = (p, d), механизм отобра-
жения ищет номер страницы p в таблице страниц и определяет, что эта стра-
ница находится в страничном кадре p', формируя реальный адрес из p' и d.
Таблица страниц (page table) адресуется при помощи специального реги-
стра процессора и позволяет определить номер кадра по логическому адресу.
Помимо этой основной задачи, при помощи атрибутов, записанных в строке
159

таблицы страниц, можно организовать контроль доступа к конкретной стра-
нице и ее защиту.
Рис. 63. Связь логического и физического адресов при страничной орга-
низации памяти
Отметим еще раз различие точек зрения пользователя и системы на ис-
пользуемую память. С точки зрения пользователя, его память – единое не-
прерывное пространство, содержащее только одну программу. Реальное ото-
бражение скрыто от пользователя и контролируется ОС. Заметим, что про-
цессу пользователя чужая память недоступна. Он не имеет возможности ад-
ресовать память за пределами своей таблицы страниц, которая включает только его собственные страницы.
Для управления физической памятью ОС поддерживает структуру таб-
лицы кадров. Она имеет одну запись на каждый физический кадр, показы-
вающий его состояние.
160