ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.


Емкость для дизельного топлива мини азс.

 

Часть 8

Глава 7  Мультизадачность
-----------------------------------------------------------------
Процессор i486 обеспечивает аппаратную поддержку
мультизадачности. Задачей называется программа, выполняемая в
текущий момент, либо ожидающая выполнения во время работы другой
программы. Задача запускается прерыванием, исключением,
переходом или вызовом. Когда одна из этих форм передачи
управления используется с назначением, заданным элементом одной
из дескрипторных таблиц, этот дескриптор может иметь тип,
вызывающий начало выполнение новой задачи после сохранения
состояния текущей задачи. Существует два типа
задаче-ориентированных дескрипторов, которые могут находиться в
таблице дескрипторов: дескрипторы сегмента состояния задачи и
шлюзы задачи. Когда управление передается любому из таких
дескрипторов, происходит переключение задачи.
Переключение задачи похоже на вызов процедуры, но оно выполняет
сохранение большего количества информации о состоянии
процессора. Вызов процедуры сохраняет только содержимое
регистров общего назначение, а в некоторых случаях содержимое
только одного регистра (EIP). При вызове процедуры содержимое
сохраняемых регистров помещается в стек, чтобы процедура имела
возможность вызвать сама себя. Когда процедура вызывает сама
себя, она называется реентерабельной.
Переключение задачи передает выполнение в полностью иную среду,
среду задачи. Для этого требуется сохранить содержимое
практически всех регистров процессора, таких как регистр EFLAGS.
В отличие от процедур, задачи не реентерабельны. Переключение
задачи ничего не помещает в стек. Информация о состоянии
процессора сохраняется в структуре данных в памяти, которая
называется сегмент состояния задачи.
В число регистров и структур данных, поддерживающих
мультизадачность, входят:
- Сегмент состояния задачи.
- Дескриптор сегмента состояния задачи.
- Регистр задачи
- Дескриптор шлюза задачи.
Используя эти структуры, процессор i486 может переключать
выполнение с одной задачи на другую, сохраняя контекст текущей
задачи, допуская тем самым рестарт другой задачи. Помимо
простого переключения задач, процессор i486 предлагает еще два
средства организации мультизадачности:
1. Переключение задачи может выполняться вследствие прерываний и
   исключений (если это требуется конструкции системы).
   Процессор не только выполняет переключение задачи для
   обработки прерывания или исключения, но и автоматическое
   переключение назад, на прерванную задачу, после возврата из
   прерывания или исключения. Прерывания могут происходить и во
   время задач обработки прерывания.
2. При каждом переключении на другую задачу процессор i486 может
   также выполнять переключение на другую LDT. Это может
   использоваться для того, чтобы дать каждой задаче собственное
   отображение логических адресов в физические. Тем самым
   обеспечивается дополнительное средство защиты, поскольку
   задачи могут быть таким образом изолированы, и их взаимное
   влияние друг на друга исключено. Регистр PDBR также
   перезагружается. Это позволяет использовать механизм подкачки
   страниц для обеспечения изолированности задач.
Использование механизма мультизадачности является
необязательным. Для некоторых прикладных программ этот способ
организации выполнения программ не является лучшим. При
необходимости наибольшей скорости реакции на прерывания, время,
которое потребуется на сохранение состояния процессора при
переключении задачи может оказаться слишком большим. В этой
ситуации возможный компромисс может состоять в том, чтобы
использовать задаче-ориентированные структуры данных, но
выполнять переключение задач программными, а не аппаратными
средствами. Это позволяет сохранять меньшее количество
информации о состоянии процессора. Этот метод может являться
одним из методов оптимизации, используемых для улучшения
характеристик быстродействия системы после реализации базовых
функции системы.
7.1  Сегмент состояния задачи
-----------------------------------------------------------------
Информация о состоянии процессора, необходимая для
восстановления контекста задачи, хранится в типе сегмента,
называемом сегментом состояния задачи, или TSS. На Рисунке 7-1
показан формат TSS для задачи, выполняемой центральным
процессором i486 (совместимость с задачами 80286 обеспечивается
другим типом TSS: см. Главу 21). Поля TSS делятся на две
основные категории:
1. Динамические поля, обновляемые процессором при каждом
   переключении задачи. В число этих полей входят:
   - Регистры общего назначения (EAX, ECX, EDX, EBX, ESP,EBP,
     ESI и EDI).
   - Сегментные регистры (ES, CS, SS, DS, FS и GS).
   - Регистр флагов (EFLAGS).
   - Указатель команд (EIP),
   - Селектор для TSS предыдущей задачи (обновляется только
     когда ожидается возврат).
2. Статические поля, которые процессор считывает, но не
   изменяет. Эти поля устанавливаются при создании задачи. Эти
   поля:
   - Селектор для LDT задачи.
   - Логический адрес для стеков привилегированных уровней 0, 1
     и 2.
   - Бит T (бит отладочной ловушки), который, будучи
     установленным, заставляет процессор устанавливать при
     переключении задачи отладочное исключение. (Более подробную
     информацию об отладке см. в Главе 11).
   - Базовый адрес битового массива разрешения ввода/вывода. При
     наличии, данный массив всегда хранится в TSS по старшим
     адресам. Базовый адрес указывает на начало массива. (Более
     подробную информацию о битовом массиве разрешения
     ввода/вывода см. в Главе 8).
При использовании механизма подкачки страниц важно избегать
помещения границы страницы в пределах части TSS, считываемой
процессором при переключении задачи (первые 108 байтов). Если
граница страницы находится в пределах этой части TSS, то
страницы по обеим сторонам границы должны присутствовать в
памяти одновременно. При отсутствии страницы или генерации
исключения общей защиты после того, как процессор начал
чтение TSS, возникает состояние невосстановимой ошибки.
7.2  Дескриптор TSS
-----------------------------------------------------------------
Сегмент состояния задачи, как и все прочие сегменты,
определяется дескриптором. Формат дескриптора TSS показан на
Рисунке 7-2.
31                       15                     0
--------------------------------------------------
|Базовый адрес массива   |    000000000000000  |T|  64
|  ввода/вывода          |                     | |
|------------------------------------------------|
|  0000000000000000      |Селектор для LDT задачи|
|------------------------------------------------|
|  0000000000000000      |         GS            |
|------------------------------------------------|
|  0000000000000000      |         FS            |
|------------------------------------------------|
|  0000000000000000      |         DS            |
|------------------------------------------------|
|  0000000000000000      |         SS            |
|------------------------------------------------|
|  0000000000000000      |         CS            |
|------------------------------------------------|
|  0000000000000000      |         ES            |
|------------------------------------------------|
|                       EDI                      |
|------------------------------------------------|
|                       ESI                      |
|------------------------------------------------|
|                       EBP                      |
|------------------------------------------------|
|                       ESP                      |
|------------------------------------------------|
|                       EBX                      |
|------------------------------------------------|
|                       EDX                      |
|------------------------------------------------|
|                       ECX                      |
|------------------------------------------------|
|                       EAX                      |
|------------------------------------------------|
|                     EFLAGS                     |
|------------------------------------------------|
|                       EIP                      |
|------------------------------------------------|
|                    Резервируется               |
|------------------------------------------------|
|  0000000000000000      |         SS2           |
|------------------------------------------------|
|                      ESP2                      |
|------------------------------------------------|
|  0000000000000000      |         SS1           |
|------------------------------------------------|
|                      ESP1                      |
|------------------------------------------------|
|  0000000000000000      |         SS0           |
|------------------------------------------------|
|                      ESP0                      |
|------------------------------------------------|
|  0000000000000000      |Компоновка задач       |
|                        |(старый селектор TSS)  |
--------------------------------------------------
Адреса показаны в шестнадцатиричном формате
ПРИМЕЧАНИЕ: Биты, помеченные как 0, резервируются. Не используйте
их.
             Рисунок 7-1. Сегмент состояния задачи
Бит "Занят" в поле Типа указывает на то, что задача занята.
Занятой задачей называется текущая выполняемая или ожидающая
выполнения задача. Поле Типа со значением 9 указывает на
не-активную задачу; значение 11 (десятичное) указывает на
занятую задачу. Задачи не-реентерабельны. Процессор i486
использует бит Занятости для обнаружения попыток вызова задачи,
выполнение которой прервано.
                       Дескриптор TSS
               2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
31             4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7            0
---------------------------------------------------------------
|               | | | |A|      | | D | |       |              |
| BASE  31:24   |G|D|0|V|LIMIT |P| P | | TYPE  |  BASE 23:16  |+4
|               | | | |L|19:16 | | L |0|1|1|B|1|              |
|-------------------------------------------------------------|
|      Базовый адрес 15:00     |    Граница сегмента 15:00    |+0
---------------------------------------------------------------
AVL       Доступно для использования системным программным
          обеспечением
B         Бит "Занятости"
BASE      Базовый адрес сегмента
DPL       Уровень привилегированности дескриптора
G         Грануляция
Граница   Граница сегмента
P         Присутствие сегмента
TYPE      Тип сегмента
     Рисунок 7-2. Дескриптор TSS
Поля Базового адреса сегмента, Границы и DPL, а также биты
Грануляции и Присутствия выполняют функции, аналогичные тем, что
были у них в дескрипторах сегментов данных. Поле Границы должно
иметь значение, равное или больше чем 67H, на один байт меньше
минимального размера сегмента состояния задачи. Попытка
выполнить переключение на задачу, дескриптор TSS которой имеет
границу меньше чем 67H, генерирует исключение. При использовании
битового массива разрешения ввода/вывода требуется большее
значение Границы. Большее значение Границы может также
понадобиться для самой операционной системы, если система хранит
в TSS дополнительные данные.
Процедура с доступом к дескриптору TSS может вызвать
переключение задачи. В большинстве систем поля DPL дескрипторов
TSS должны быть очищены, чтобы только привилегированное
программное обеспечение могло выполнить переключение задачи.
Доступ к дескриптору TSS не дает процедуре возможности читать
или модифицировать дескриптор. Чтение и модификация его возможны
только путем отображения в тот же адрес памяти дескриптора
данных. Загрузка дескриптора TSS в сегментный регистр вызывает
исключение. Дескрипторы TSS могут находиться только в таблице
GDT. Попытка доступа к TSS при помощи селектора с установленным
битом TI (который обозначает текущую LDT) генерирует исключение.
7.3  Регистр задачи
-----------------------------------------------------------------
Регистр задачи (TR) используется для поиска текущего TSS. На
Рисунке 7-3 показан путь, по которому процессор выполняет доступ
к TSS.
Сегмент состояния задачи    -----
--------------------- <-----| + |<------------------
|                   |       -----                   |
|                   |         ^                     |
|                   |         |                     |
|                   |         |                     |
|                   |         |                     |
|                   |         |                     |
|                   |         |                     |
|                   |         |                     |
|                   |         |                     |
---------------------         |                     |
                              |                     |
   Видимая часть              |  Невидимая часть    |
---------------------------------------------------------------
|   Селектор        |  Базовый адрес     | Граница сегмента   |TR
---------------------------------------------------------------
       |                     ^                     ^
       |                     |                     |
       |                      ----------------     |
       |                                      |    |
       |                                      |    |
       |              Глобальная              |    |
       |        таблица дескрипторов          |    |
       |       ------------------------       |    |
       |       |           |          | N     |    |
       |       |----------------------|       |    |
       |       |                      |       |    |
       |       |----------------------|       |    |
       |       |           |          |       |    |
       |       |----------------------|       |    |
       |       |                      |       |    |
       |       |----------------------|       |    |
       |       |           |          |       |    |
       |       |----------------------|       |    |
       |       |                      |       |    |
       |       |----------------------|       |    |
       |       |                      |-------     |
        ------>|     Дескриптор TSS   |            |
               |                      |------------
               |----------------------|
               |           |          |
               |----------------------|
               |                      |
               |----------------------|
               |           |          |
               |----------------------|
               |                      |
               |----------------------|
               |           |          |
               |----------------------|
               |                      |
               |----------------------|
               |           |          |
               |----------------------|
               |                      | 0
               ------------------------
                    Рисунок 7-3. Регистр TR
Регистр задачи имеет "видимую" часть (т.е. часть, которую может
считывать и изменять программное обеспечение) и "невидимую"
часть (т.е. часть, обслуживаемую процессором и недоступную
программному обеспечению). Селектор, находящийся в видимой
части, индексирует дескриптор TSS в GDT. Процессор использует
невидимую часть регистра TR для приема туда значений базы и
границы из дескриптора TSS. Хранение в регистре этих значений
делает выполнение задачи более эффективным, поскольку для ссылки
к TSS текущей задачи процессору не требуется извлекать эти
значения из памяти.
Команды LTR и STR используются для модификации и чтения видимой
части регистра задачи. Обе эти команды принимают один операнд, а
именно 16-разрядный селектор сегмента, расположенный в памяти
или в регистре общего назначения.
LTR (Загрузить регистр задачи) загружает в видимую часть
регистра задачи операнд, который должен индексировать позицию
дескриптора TSS в GDT. Команда LDT также загружает в невидимую
часть информацию из дескриптора TSS. Команда LTR является
привилегированной командой: она может быть выполнена только при
CPL равном 0. Команда LTR обычно используется во время
инициализации системы для помещения в регистр задачи исходного
значения: далее содержимое регистра TR изменяется событиями,
вызывающими переключение задачи.
STR (Сохранить регистр задачи) записывает видимую часть регистра
задачи в регистр общего назначения или в память. Команда STR не
является привилегированной командой.
7.4  Дескриптор шлюза задачи
-----------------------------------------------------------------
Дескриптор шлюза задачи обеспечивает косвенные, защищенные
ссылки к задаче. Формат шлюза задачи показан на Рисунке 7-4.
Поле Селектор шлюза задачи индексирует дескриптор TSS. RPL в
данном селекторе не используется.
DPL шлюза задачи управляет доступом к дескриптору для
переключения задачи. Процедура не может выбрать дескриптор шлюза
задачи до тех пор, пока RPL селектора и CPL процедуры не будут
численно меньше или равны DPL дескриптора. Тем самым
предотвращается переключение задачи менее привилегированными,
чем она сама, процедурами. (Отметим, что при использовании шлюза
задачи DPL дескриптора TSS назначения не используется).
                    Дескриптор шлюза задачи
                               1 1 1 1 1 1 1
31                             6 5 4 3 2 1 0 9 8 7            0
---------------------------------------------------------------
|                              | | D |         |              |
|        Резервируется         |P| P |0 0 1 0 1| Резервируется|+4
|                              | | L |         |              |
|-------------------------------------------------------------|
|      Селектор сегмента TSS   |       Резервируется          |+0
---------------------------------------------------------------
DPL       Уровень привилегированности дескриптора
P         Присутствие сегмента
              Рисунок 7-4. Дескриптор шлюза задачи
Процедура с доступом к шлюзу задачи может вызвать переключение
задачи, как и процедура с доступом к дескриптору TSS. Как шлюзы
задачи, так и дескрипторы TSS предназначены для решения
следующих вопросов:
1. Необходимость иметь для задач только один бит Занятости.
   Поскольку этот бит хранится в дескрипторе TSS, каждая задача
   должна иметь только один такой дескриптор. Однако, может
   существовать несколько шлюзов задачи, выбирающих один
   дескриптор TSS.
2. Необходимость обеспечить селективный доступ к задачам. Шлюзы
   задачи позволяют решить эту проблему, поскольку они могут
   размещаться в LDT и иметь DPL, отличный от DPL дескриптора
   TSS. Процедура, недостаточно привилегированная для
   использования дескриптора TSS в GDT (который обычно имеет
   DPL, равный 0), может тем не менее вызвать другую задачу,
   если она имеет доступ к шлюзу задачи в LDT. Благодаря шлюзам
   задачи операционная система может ограничить переключение
   задач конкретными задачами.
3. Необходимость выполнения переключения задачи в случае
   прерывания или особой ситуации. Если прерывание или
   исключение передает в шлюз задачи вектор, процессор i486
   выполняет переключение на указанную задачу.
На Рисунке 7-5 показано, как шлюз задачи в LDT и шлюз задачи в
IDT могут идентифицировать одну и ту же задачу.
7.5  Переключение задачи
-----------------------------------------------------------------
Процессор i486 передает управление другой задаче в одном из
следующих четырех случаев:
1. Текущая задача выполняет команду JMP или CALL для дескриптора
   TSS.
2. Текущая задача выполняет команду JMP или CALL для шлюза
   задачи.
3. Прерывание или исключение индексирует шлюз задачи в IDT.
4. Текущая задача выполняет команду IRET при установленном флаге
   NT.
Команды JMP, CALL и RET, равно как прерывания и исключения,
представляют собой обычные механизмы процессора i486, которые
могут быть использованы и при обстоятельствах, не приводящих к
переключению задачи. Тип дескриптора (при вызове задачи) или
флаг NT (при возврате из задачи) определяют разницу между
стандартным механизмом и его формой, вызывающей переключение
задачи.
Для того, чтобы произошло переключение задачи, команда JMP или
CALL может передать управление либо дескриптору TSS, либо шлюзу
задачи. Эффект в обоих случаях одинаковый: процессор i486
передает управление требуемой задаче.
Исключение или прерывание вызывают переключение задачи,
индексируя шлюз задачи в IDT. Если они индексируют в IDT шлюз
прерывания или шлюз ловушки, то переключения задачи не
происходит. Более подробную информацию о механизме прерываний
см. в Главе 9.
                                               Сегмент
                                               состояния задачи
                                               -----------------
Локальная                Глобальная            |               |
таблица дескрипторов     таблица дескрипторов  |               |
-----------------        -----------------     |               |
|       |       |        |       |       |     |               |
|---------------|        |---------------|     |               |
|               |        |               |     |               |
|---------------|        |---------------|     |               |
|       |       |        |       |       |     |               |
|---------------|        |---------------|     |               |
|               |        |               |     |               |
|---------------|        |---------------|     |               |
|       |       |------->|       |       |     |               |
|- Шлюз задачи -|      ->|Дескриптор TSS |---->-----------------
|---------------|     |  |---------------|
|       |       |     |  |       |       |
|---------------|     |  |---------------|
|               |     |  |               |
|---------------|     |  |---------------|
|       |       |     |  |       |       |
|---------------|     |  |---------------|
|               |     |  |               |
|---------------|     |  |---------------|
|       |       |     |  |       |       |
|---------------|     |  |---------------|
|               |     |  |               |
-----------------     |  -----------------
                      |
                      |
                      |
                      |
Таблица дескрипторов  |
прерываний            |
-----------------     |
|       |       |     |
|---------------|     |
|               |     |
|---------------|     |
|       |       |     |
|---------------|     |
|               |     |
|---------------|     |
|       |       |     |
|-Шлюз задачи --|-----
|---------------|
|       |       |
|---------------|
|               |
|---------------|
|       |       |
|---------------|
|               |
|---------------|
|       |       |
|---------------|
|               |
-----------------
        Рисунок 7-5. Задачи со ссылками на шлюзы задачи
Подпрограмма обслуживания прерывания всегда возвращает
выполнение в прерванную процедуру, которая может находиться в
другой задаче. Если флаг NT очищен, происходит нормальный
возврат. Если флаг NT установлен, происходит переключение
задачи. Задача, принимающая переключение, задается селектором
TSS в TSS подпрограммы обслуживания прерывания.
     Переключение задачи имеет следующие этапы:
1. Проверка того, что текущей задаче разрешено выполнить
   переключение на другую задачу. К командам JMP и CALL
   применимы правила привилегированности доступа к данным. DPL
   дескриптора TSS и шлюза задачи должен быть больше чем или
   равен одновременно CPL и RPL селектора шлюза. исключения,
   прерывания и команды IRET имеют право переключать задачу
   независимо от DPL шлюза задачи или дескриптора TSS
   назначения.
2. Проверка того, что дескриптор TSS новой задачи помечен как
   присутствующий и имеет допустимую границу (превышающую или
   равную 67H). Любые случившиеся до этой точки ошибки
   принадлежат контексту текущей задачи. При попытке выполнить
   приводящую к ошибке команду эти ошибки восстанавливают любые
   изменения состояния процессора. Благодаря этому адрес
   возврата для обработчика прерываний указывает на команду,
   вызвавшую ошибку, а не на команду, следующую за ней.
   Обработчик исключений может зафиксировать условие, вызвавшее
   ошибку, и выполнить рестарт задачи. Вмешательство обработчика
   исключений может быть полностью прозрачно для прикладной
   программы.
3. Сохранение состояния текущей задачи. Процессор находит
   базовый адрес текущего TSS в регистре задачи. Регистры
   процессора копируются в текущий TSS (регистры EAX, ECX, EDX,
   EBX, ESP, EBP, ESI, EDI, ES, CS, SS, DS, FS, GS и EFLAGS).
4. Загрузка в регистр TR селектора для дескриптора TSS новой
   задачи, установка бита Занятости новой задачи и установка
   бита TS в регистре CR0. Селектор либо является операндом
   команды JMP или CALL, либо берется из шлюза задачи.
5. Загрузка состояния новой задачи из ее TSS и продолжение ее
   выполнения. При этом загружаются регистры LDTR, EFLAGS,
   регистры общего назначения EIP, EAX, ECX, EDX, EBX, ESP, EBP,
   ESI, EDI, а также сегментные регистры Es, CS, SS, DS, FS и
   GS. Любые ошибки, обнаруживаемые на этом шаге, принадлежат к
   контексту новой задачи. С точки зрения обработчика исключений
   первая команда новой задачи не является выполненной.
Отметим, что состояние старой задачи при переключении задачи
всегда сохраняется. При возобновлении этой задачи выполнение ее
продолжается с той команды, которая была бы выполнена следующей
при обычной работе. Регистры восстанавливаются в те значения,
которые они имели к моменту останова задачи для переключения.
Каждое переключение задачи устанавливает бит TS (Задача
Переключена) регистра CR0. Бит TS полезен системным программам
для координации работы целочисленного блока и блока операций с
плавающей точкой или сопроцессора. Бит TS указывает на то, что
содержимое блока операций с плавающей точкой или сопроцессора
может отличиться от соответствующего содержимого для текущей
задачи. В главе 10 бит TS и сопроцессоры рассматриваются более
подробно.
Подпрограммы обслуживания исключений, вызванных переключением
задачи (исключения вследствие шагов 5 - 17 в таблице 7-1)
могут начать вызываться рекурсивно в случае попытки
перезагрузить селектор сегмента, сгенерировавшего данное
исключение. Причина исключения (или одна из нескольких
причин) до повторения загрузки сегмента должна быть
зафиксирована.
Уровень привилегированности, с которым выполнялась старая
задача, не имеет отношения к уровню привилегированности новой
задачи. Поскольку задачи изолированы друг от друга благодаря
отдельным адресным пространствам и сегментам состояния задачи, и
поскольку доступ к TSS выполняется по правилам
привилегированности, переключение задачи не требует никаких
проверок привилегированности. Новая задача начинает выполняться
с уровнем привилегированности, указанным в RPL нового
содержимого регистра CS, загружаемого из TSS.
Проверки, выполняемые при переключении задачи         Таблица 7-1
-----------------------------------------------------------------
Шаг  Проверяемое условие               Особая  1)   Ссылка
                                       ситуация     на код ошибки
-----------------------------------------------------------------
 1   Дескриптор TSS присутствует         NP      TSS новой задачи
     в памяти
 2   Дескриптор TSS не Занят             GP      TSS новой задачи
 3   Граница сегмента TSS больше чем     TS      TSS новой задачи
     или равна 103
-----------------------------------------------------------------
 4   Загрузка регистров из значений, хранимых в TSS
-----------------------------------------------------------------
 5   Допустимость селектора LDT          TS      TSS новой задачи
     новой задачи
 6   DPL кодового сегмента               TS    Новый сегмент кода
     соответствует RPL селектора
                               2)
 7   Допустимость селектора SS           GP   Новый сегмент стека
 8   Сегмент стека присутствует в памяти SF   Новый сегмент стека
 9   DPL сегмента стека                  SF   Новый сегмент стека
     соответствует CPL
10   LDT новой задачи присутствует       TS      TSS новой задачи
     в памяти
                               2)
11   Допустимость селектора CS           TS    Новый сегмент кода
12   Сегмент кода присутствует           NP    Новый сегмент кода
     в памяти
13   DPL сегмента стека                  GP   Новый сегмент стека
     соответствует RPL селектора
14   Допустимость селекторов             GP  Новый сегмент данных
     DS,ES,FS и GS             2)
15   Сегменты DS,ES,FS и GS доступны     GP  Новый сегмент данных
     для чтения
16   Сегменты DS,ES,FS и GS              NP  Новый сегмент данных
     присутствуют в памяти
17   DPL сегментов DS,ES,FS и GS         GP  Новый сегмент данных
     больше или равен CPL (если эти
     сегменты не являются конформными)
-----------------------------------------------------------------
Примечание: Следующие процессоры Intel могут использовать другой
порядок проверок.
     1. NP = исключение "Сегмент не присутствует"; GP=
        исключение общей защиты; TS= исключение "Неверный TSS";
        SF=исключение "Сбой в стеке".
     2. Селектор является допустимым, если он находится в таблице
        совместимого типа (например, селектор LDT не может
        находиться ни в одной таблице, кроме GDT), занимает
        адрес в пределах границы табличного сегмента и ссылается
        на совместимый тип дескриптора (например, селектор в
        регистре CS является допустимым только в том случае,
        если он индексирует дескриптор кодового сегмента; тип
        дескриптора задается в его поле Типа).
7.6  Компоновка задач
-----------------------------------------------------------------
Для возврата выполнения на предыдущую задачу используются поле
Компоновки в TSS и флаг NT. Флаг NT указывает на то, является ли
текущая выполняемая задача вложенной в выполнение другой задачи,
а поле Компоновки в TSS текущей задачи содержит селектор TSS для
задачи более старшего уровня, если таковая имеется (см. Рисунок
7-6).
Когда прерывание, исключение, переход или вызов вызывают
переключение задачи, процессор i486 копирует селектор сегмента
состояния текущей задачи в TSS для новой задачи и устанавливает
флаг NT. Флаг NT указывает на то, что поле Компоновки TSS было
загружено селектором сохраненного TSS. Новая задача возвращает
управление командой IRET. При выполнении команды IRET происходит
проверка флага NT. Если он установлен, то процессор выполняет
переключение на предыдущую задачу. В Таблице 7-2 показано
использование полей TSS, на которые воздействует переключение
задачи.
Отметим, что флаг NT может быть модифицирован программным
обеспечением, выполняемым на любом уровне привилегированности.
Программа может установить свой бит NT и выполнить команду IRET,
что будет иметь эффект запуска задачи, заданной в поле
Компоновки TSS текущей задачи. Для предотвращения
непредусмотренных переключений задачи операционная система
должна инициализировать поле Компоновки каждого создаваемого ей
TSS.
  Задача        Вложенная     Задача самого   Текущая
  старшего      задача        глубокого       выполняемая
  уровня                      уровня          задача
                              вложенности
   TSS             TSS            TSS           EFLAGS
------------   ------------   ------------   ------------
|          |   |          |   |          |   |   NT=1   |
|          |   |          |   |          |   ------------
|          |   |          |   |          |
|  NT=0    |   |  NT=0    |   |  NT=0    |
|          |   |          |   |          |
|          |   |          |   |          |
|          |   |          |   |          |
|     -----|   |     -----|   |     -----|   ------------
|     |LINK|   |     |LINK|   |     |LINK|   |Регистр TR|
------------   ------------   ------------   ------------
            \           |  \          |   \        |
             \__________|   \_________|    \_______|
LINK = Поле Компоновки задач
                 Рисунок 7-6.  Вложенные задачи
          Таблица 7-2. Воздействие переключения задачи
               на поля Занятости, NT и Компоновки
-----------------------------------------------------------------
  Поле         Воздействие JUMP   Воздействие        Воздействие
                                  команды CALL       команды IRET
                                  или прерывания
-----------------------------------------------------------------
Бит Занятости  Бит установлен.    Бит установлен.    Изменений не
новой задачи   Перед этим должен  Перед этим должен  Должен быть
               быть очищен        быть очищен        установлен
Бит Занятости  Бит очищен         Изменений нет.     Бит очищен
старой задачи                     В текущий момент
                                  бит установлен
Флаг NT        Флаг очищен        Флаг установлен    Изменений не
новой задачи
Флаг NT        Изменений нет      Изменений нет      Флаг очищен
старой задачи
Поле           Изменений нет      Загружено          Изменений не
Компоновки                        селектором для TSS
новой задачи                      старой задачи
Поле           Изменений нет      Изменений нет      Изменений не
Компоновки
старой задачи
-----------------------------------------------------------------
7.6.1  Бит Занятости предотврашает зацикливание
-----------------------------------------------------------------
Бит Занятости дескриптора TSS предотвращает реентерабельные
переключения задач. Существует лишь один сохраненный контекст
каждой задачи, а именно контекст, сохраненный в TSS,
следовательно, задача до своего завершения может быть вызвана
только один раз. Цепочка отложенных задач может вырасти до любой
длины вследствие множественных прерываний, исключений, переходов
и вызовов. Бит Занятости предотвращает вызов задачи,
поставленной в такую цепочку. Реентерабельное же переключение
задачи затрет старый TSS задачи, что приведет к разрушению всей
цепочки.
Процессор организует бит Занятости следующим образом:
1. При переключении задачи процессор устанавливает бит Занятости
   новой задачи.
2. При обратном переключении из задачи процессор очищает бит
   занятости старой задачи, если эта задача не должна быть
   поставлена в цепочку (т.е. команда, вызвавшая переключение
   задачи, это команда JMP или IRET). Если задача поставлена в
   цепочку, то ее бит Занятости остается установленным.
3. При переключении на задачу процессор генерирует исключение
   общей защиты, если бит Занятости новой задачи оказывается уже
   установленным.
Таким образом, процессор предотвращает переключение задачи самой
на себя, либо на любую задачу в цепочке задач, что исключает
реентерабельное переключение задачи.
Бит Занятости может использоваться в многопроцессорной
конфигурации системы, поскольку при установке или очистке бита
Занятости процессор захватывает шину. Это исключает
одновременный запуск одной и той же задачи двумя процессорами.
(Более подробную информацию о многопроцессорной обработке см. в
главе 13).
7.6.2  Модификация компоновки задач
-----------------------------------------------------------------
Для возобновления выполнения прерванной задачи до выполнения
прервавшей ее задачи может понадобиться модификация цепочки
отложенных задач. Надежный способ состоит в следующем:
     1. Запретить прерывания.
     2. Сначала изменить поле Компоновки TSS задачи прерывания,
        а затем очистить бит Занятости в дескрипторе TSS задачи,
        удаляемой из цепочки.
     3. Снова разрешить прерывания.
7.7  Адресное пространство задачи
-----------------------------------------------------------------
Для того, чтобы каждая задача имела собственную LDT и
собственные таблицы страниц, могут быть использованы селектор
LDT и поле PDBR (в CR3) TSS. Поскольку дескрипторы сегментов в
LDT представляют собой связки между задачами и сегментами, для
установки индивидуального управления этими связками для каждой
задачи могут использоваться отдельные LDT. Доступ к любому
конкретному сегменту может быть передан любой конкретной задаче
путем помещения дескриптора этого сегмента в LDT задачи. При
разрешенном механизме подкачки каждая задача может иметь свой
собственный набор страничных таблиц для отображения линейных
адресов в физические.
Задачи могут также иметь общую LDT. Это простой и эффективный по
затратам памяти способ организации коммуникации между задачами
или управления одних задач другими, не снимая защитных барьеров
в системе в целом.
Поскольку все задачи имеют доступ к GDT, также возможно создание
разделяемых сегментов, доступ к которым будет происходить через
сегментные дескрипторы из данной таблицы.
7.7.1  Отображение линейного адресного пространства задачи
       в физическое
-----------------------------------------------------------------
Способы организации отображения линейного адресного пространства
задачи в физическое делятся на два общих класса:
1. Единое отображение линейного адресного пространства в
   физическое, разделяемое всеми задачами. Если механизм
   подкачки страниц запрещен, то этот способ единственный. Без
   подкачки страниц все линейные адреса отображаются в те же
   физические адреса. При разрешенной подкачке страниц данная
   форма отображения достигается путем использования одного
   каталога страниц для всех задач. Линейное адресное
   пространство может превышать физическое пространство, если
   поддерживается виртуальная память с подкачкой по обращению.
2. Независимое отображение линейного адресного пространства в
   физическое. Эта форма отображения существует при
   использовании собственного каталога страниц для каждой
   задачи. Поскольку PDBR (базовый регистр каталога страниц)
   загружается из TSS при каждом переключении задачи, каждая
   задача может иметь собственный страничный каталог.
Линейные адресные пространства различных задач могут
отображаться в полностью раздельные физические адреса. Если
элементы разных страничных каталогов указывают на разные
страничные таблицы, а эти таблицы указывают на разные страницы
физической памяти, то такие задачи не разделяют никаких
физических адресов памяти.
Сегменты состояния задачи должны находиться в пространстве,
доступном всем задачам, таким образом чтобы отображение адресов
TSS не изменялось во время чтения или обновления процессором TSS
при переключении задачи. Линейное пространство, в которое
отображается GDT, также должно быть разделяемым физическим
пространством; в противном случае теряется смысл GDT. На Рисунке
7-7 показано, как линейные пространства двух задач могут
перекрываться в физическом адресном пространстве при разделении
ими страничных таблиц.
7.7.2  Логическое адресное пространство задачи
-----------------------------------------------------------------
Само по себе отображение линейного адресного пространства в
физическое с перекрытием не позволяет разделение данных
задачами. Для разделения данных задачи должны также иметь общее
отображение логического адресного пространства в линейное, т.е.
они также должны иметь доступ к дескрипторам, указывающим на
разделяемое линейное адресное пространство. Существует три
способа создания разделяемого отображения логического адресного
пространства в физическое:
1. При помощи сегментных дескрипторов в GDT. Все задачи имеют
   доступ к дескрипторам в GDT. Если эти дескрипторы указывают
   на линейное адресное пространство, отображаемое в общее для
   всех задач физическое адресное пространство, то задачи могут
   разделять данные и команды.
2. При помощи разделяемых LDT. Две или более задачи могут
   использовать одну и ту же LDT, если селекторы LDT в их TSS
   для использовании при трансляции адресов выбирают одну и ту
   же LDT. Сегментные дескрипторы в LDT, адресующие линейные
   пространства, отображаемые в перекрывающиеся физическое
   адресное пространство, обеспечивают разделяемую физическую
   память. Этот метод разделения более селективен, чем метод
   организации разделения посредством GDT, поскольку он
   позволяет ограничить разделение конкретными задачами. Прочие
   задачи в системе могут иметь другие LDT, не дающие им доступ
   к разделяемым областям памяти.
3. При помощи сегментных дескрипторов в LDT, отображающихся
   в одно и то же линейное адресное пространство. Если линейное
   адресное пространство отображается в то же самое физическое
   адресное пространство за счет постраничного отображения
   участвующих задач, эти дескрипторы позволяют задачам
   разделение адресного пространства. Такие дескрипторы обычно
   называют "алиасами". Такой метод разделения даже более
   селективен, чем предыдущий: прочие дескрипторы в LDT могут
   указывать на независимые линейные адреса, не являющиеся
   разделяемыми.
                                                    Страничные
    TSS                                               блоки
                                                   -------------
                                                   | Страница  |
                   Каталоги        Таблицы         |  задачи   |
TSS задачи A       страниц         страниц       ->|     А     |
------------     ------------     ------------  |  -------------
|          |     |          |     |          |  |
|          |     |----------|     |----------|  |  -------------
|          |     |          |     | элемент  |--   | Страница  |
|          |     |----------|     |----------|     |  задачи   |
|          |     |          |     | элемент  |---->|     A     |
|----------|     |----------|     |----------|     -------------
|   PDBR   |---->|  элемент |---->| элемент  |--
|----------|     |----------|     ------------ |   -------------
|          |     |  элемент |--                |   | Страница  |
------------     ------------  |               --->|  задачи   |
                               |                   |     A     |
                               |  Разделяемые      -------------
                               |  таблицы страниц
                               |  ------------
                               |  |          |
                               |  |----------|     -------------
                               |  |          |     |Разделяемая|
                               |  |----------|     |  страница |
                               |  |  элемент |---->|           |
                               |  |----------|     -------------
                                ->|  элемент |--
                                ->------------ |   -------------
TSS задачи B                   |               |   |Разделяемая|
------------     ------------  |               |   |  страница |
|          |     |          |  |               |   |           |
|          |     |----------|  |  ------------  -->-------------
|          |     |          |  |  |          |
|          |     |----------|  |  |----------|     -------------
|          |     |          |  |  |          |     | Страница  |
|----------|     |----------|  |  |----------|     |  задачи   |
|  PDBR    |---->|  элемент |--   |  элемент |---->|     В     |
|----------|     |----------|     |----------|     -------------
|          |     |  злемент |---->|  элемент |--
------------     ------------     ------------ |   -------------
   TSS             Каталоги         Таблицы    |   | Страница  |
                   страниц          страниц    |   |  задачи   |
                                               |   |     В     |
                                                -->-------------
                                                     Страничные
                                                        блоки
   Рисунок 7-7. Отображение линейного адресного пространства
                   в физическое с перекрытием


Яндекс цитирования