Команда LMSW может модифицировать только младшие 16 битов регистра CR0.

PG (Подкачка страниц, бит 31)

Данный бит разрешает подкачку страниц, если он установлен, и запрещает ее, если он очищен.

Когда при подкачке страниц возникает исключение, в регистр CR2 помещается 32-разрядный линейный адрес, вызвавший это исключение.

При использовании подкачки страниц регистр CR3 содержит 20 наиболее значащих битов адреса страничного каталога (таблицы страниц первого уровня). Регистр CR3 также называется базовым регистром страничного каталога (PDBR). Отметим, что страничный каталог должен быть выровнен по границе страницы, поэтому 12 младших битов регистра игнорируются. В отличие от процессора 386 DX, процессор i486 назначает функции двум из этих битов. Это:

PCD (Запрещение кэширования на уровне страниц, бит 4 регистра CR3)

Состояние этого бита устанавливается в зависимости от состояния штырька PCD во время циклов шины, не работающих со страницами (например, циклов квитирования прерывания), когда подкачка страниц разрешена. Если подкачка страниц запрещена, то состояние этого бита устанавливается в любых циклах шины. Штырек PCD используется для управления работой внешнего КЭШа по циклам.

PWT (Прозрачность записи на уровне страниц, бит 3 регистра CR3)

Состояние этого бита устанавливается в зависимости от состояния штырька PWT во время циклов шины, не работающих со страницами (например, циклов квитирования прерывания), когда подкачка страниц разрешена. Если подкачка страниц запрещена, то состояние этого бита устанавливается в любых циклах шины. Штырек PWT используется для управления сквозной записью во внешний кэш по циклам.

НЕ нашли? Не то? Что вы ищете?

CD (Запрещение кэширования, бит 30)

Данный бит разрешает внутреннее кэширование, если он очищен, и запрещает, если он установлен. Когда данный бит установлен, несовпадения КЭШа не вызывают заполнения строки КЭШа. Отметим, что совпадения КЭШа при этом не отменяются; для полного запрещения КЭШа он должен быть очищен.

NW (Сквозная запись не происходит, бит 29)

Данный бит разрешает сквозную запись и циклы аннулирования КЭШа, если он очищен, и запрещает циклы аннулирования и сквозную запись, ищущую совпадения КЭШа, если он установлен. Отмена сквозной записи позволяет хранить в КЭШе данные о состоянии.

AM (Маска выравнивания, бит 18)

Этот бит позволяет выполнять контроль выравнивания, если он установлен, и запрещает этот контроль, если он очищен. Контроль выравнивания выполняется только когда бит AM установлен, флаг AC установлен, а CLP имеет значение 3 (режим пользователя).

WP (Защита записи, бит 16)

Если этот бит установлен, то он защищает от записи страницы уровня пользователя при доступе в режиме супервизора. Если этот бит очищен, то страницы уровня пользователя, предназначенные только для чтения, могут быть затерты записью процессом супервизора. Это свойство может быть полезным для реализации метода "записи в копию" создания нового процесса (ветвления параллельных процессов), используемого некоторыми операционными системами (например, UNIX).

NE (Числовая ошибка, бит 5)

Этот бит разрешает стандартный механизм сообщений об ошибках при числовых операциях с плавающей точкой, если он установлен. Когда NE очищен, а вход IGNNE# активен, числовые ошибки игнорируются. Когда бит NE очищен, а вход IGNNE# не активен, числовая ошибка ведет к останову процессора и ожиданию прерывания. Прерывание генерируется при помощи штырька FERR#, формирующего ввод в контроллер прерываний (штырек FERR# эмулирует штырек ERROR# сопроцессоров 80287 и 387 DX). Бит NE, штырек IGNNE # и штырек FERR# используются внешними логическими схемами для реализации сообщений об ошибках в стиле PC.

ET (Тип расширения, бит 4)

Этот бит служит для того, чтобы указывать на поддержку команд математического сопроцессора 387 DX (Intel резервируется).

TS (Переключение задачи, бит 3)

Процессор устанавливает бит TS при каждом переключении задачи и проверяет его при интерпретации арифметических команд с плавающей точкой. Данный бит позволяет откладывать сохранение/восстановление числовых данных до их фактического использования. Команда CLTS очищает этот бит.

EM (Эмуляция, бит 2)

Если установлен один из битов, EM или TS, то выполнение команды WAIT или числовой команды генерирует исключение "сопроцессор недоступен". EM может быть установлен для получения исключения 7 для каждой команды WAIT или числовой команды.

MP (Математический сопроцессор присутствует, бит 1)

В случае процессоров 80286 и 386 DX бит MP управляет работой команды WAIT, используемой для синхронизации с сопроцессором. При выполнении программ на процессоре i486 данный бит должен быть установлен.

PE (Разрешение защиты, бит 0)

Установка бита PE разрешает защиту на уровне сегмента.

Регистры управления памятью

Четыре регистра процессора задают расположение структур данных, которые управляют организацией сегментированной памяти. Для загрузки и сохранения этих регистров имеются специальные команды. Регистры GDTR и IDTR могут быть загружены при помощи команд, извлекающих из памяти шести байтовые блоки. Регистры LDTR и TR могут быть загружены при помощи команд, принимающих в качестве операнда 16-битовый селектор сегмента. Затем остальные байты этих регистров загружаются процессором автоматически из дескриптора, на который ссылается переданный операнд.

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

Тема 1.4. Защищенный режим работы процессора.

Процессор Intel поддерживает два режима работы: реальный (Real Mode) и защищенный (Protected Mode).

Реальный режим (его еще называют режимом процессора 8086) это однопрограммный режим. Все свободное адресное пространство основной памяти распределяется работающему приложению. Принятая схема адресации ограничивает максимальный размер памяти пределом (1М + 64К - 16). Использование адресов, превышающих этот предел, возможно только косвенными методами через специализированные драйверы управления основной памятью. Особенности реального режима:

- адрес памяти, формируемый МП, является физическим адресом;

- все машинные команды системы команд разрешены для использования любой программой;

- объем адресуемой памяти не превышает 1М (исключение для 286/386/486/...: линия А20 дает дополнительно (64К -16) байт сверх 1М).

В защищенном режиме активизируются средства организации виртуальной памяти (внутреннее устройство управления памятью MMU).

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

- возможность непосредственной адресации памяти свыше 1 Мб;

- механизм виртуальной памяти (начиная с процессора 80386);

- аппаратная поддержка мультизадачности;

- использование виртуального режима процессора 8086

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

Физический адрес получается из логического при одноступенчатой схеме за одно преобразование, а при двухступенчатой - за два.

Логический адрес состоит из двух компонент: селектора и смещения. Селектор содержит индекс в таблице дескрипторов (описатель) сегментов. Селектор имеет следующую структуру:

F

индекс в таблице

TI

RPL

-  RPL - запрашиваемый уровень привилегий (2 бита);

-  TI - индикатор таблицы: 0- поиск дескриптора выполняется в глобальной дескрипторной таблице GDT, 1 - поиск осуществляется в локальной дескрипторной таблице LDT.

GDT содержит дескрипторы сегментов ОС, а также адреса локальных таблиц. В системе может быть только одна глобальная таблица дескрипторов. Для адресации таблиц используются регистры GDTR и LDTR.

Формат GDTR:

27h 10h Fh 0

базовый адрес GDT

Предел (размер GDT-1)

32 бита 20 бит

Предел хранит протяженность таблицы. Поле предела позволяет контролировать обращение к таблице по индексу. Базовый адрес таблицы показывает реальный адрес расположения таблицы в основной памяти.

Регистр LDTR имеет аналогичную структуру. Регистр глобальной таблицы загружен постоянным содержимым, а значение локального регистра меняется при переключениях между локальными дескрипторной таблицами.

Записи с нулевым индексом в таблицах не используются.

P, A - предназначены для организации виртуальной памяти; А – бит обращения к сегменту, устанавливается в 1 для тех сегментов, к которым было обращение. сбрасывается в 0 процессором; Р - бит присутствия сегментов в памяти; DPL - двух битовое поле - номер кольца защиты сегмента (допустимый уровень привилегий), максимальная привилегия 0, минимальная - 3; С - бит подчинения. С=0 - сегмент может быть вызван только программой с не менее высоким приоритетом, чем у самого сегмента, С=1 сегмент может быть вызван любой программой, но уровень привилегий выставляется как у вызывающей программы; R - бит разрешения чтения. D - направление расширения сегмента. D=1 - сегмент расширяется вниз от старших адресов к младшим (стек), D=0 - наоборот; W - возможность записи в сегмент. W=1 - запись разрешена, W=0 - разрешено только чтение. С помощью этого бита можно установить дополнительный уровень защиты сегмента.

TYPE - тип того или иного сегмента. Код, который задан в этом поле, определяет назначение сегмента. Различают следующие виды:

- TSS - сегмент состояния задачи;

- LDT - сегмент локальной дескрипторной таблицы;

- вентиль вызова;

- вентиль прерывания;

- вентиль исключения.

Вентиль - точка входа или адрес в ту или иную функцию или подпрограмму. Исключение - особая ситуация, возникающая при исполнении приложения: деление на 0, исчезновение порядка, отсутствие страницы в основной памяти.

Тема 1.5. Дескрипторы, таблица дескрипторов.

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

Все типы дескрипторов системы имеют один из этих форматов.

База: Определяет расположение сегмента в пределах 4 гигабайтного физического адресного пространства. Процессор располагает вместе три поля базового адреса, которые образуют одно 32-битовое значение. Значения базы сегмента должны быть выровнены по кратным 16 байтам адресам памяти, что позволяет программам максимизировать их быстродействие, выравнивая в свою очередь по кратным 16 байтам адресам памяти код/данные.

Бит грануляции: включает масштабирование поля границы масштабным коэффициентом 4096(2**12). Если этот бит очищен, то граница сегмента интерпретируется в блоках по 4Кб (т. е. в страницах). Отметим, что двенадцать наименее значащих битов адреса в случае, если используется масштабирование, не тестируются. Например, граница 0 при установленном бите грануляции дает допустимые смещения от 0 до 4095. Отметим также, что этот коэффициент действует только на значение поля Границы. Базовый адрес остается гранулированным по байтам.

Дескрипторы, используемые для сегментов кода и данных прикладных программ:

3

BASE 31:24

DPL

TYPE

BASE 23:16

 

Базовый адрес 15:00

Граница сегмента 15:00

Дескрипторы, используемые для специальных системных сегментов:

3

BASE 31:24

D P L

TYPE

BASE 23:16

 

Базовый адрес 15:00

Граница сегмента 15:00

AVL - Доступно для использования системным программным обеспечением

BASE - Базовый адрес сегмента

DPL - Уровень привилегированности дескриптора

S - Тип дескриптора (0=системный; 1=прикладной)

G - Грануляция

Граница сегмента

P - Присутствие сегмента

TYPE - Тип сегмента

D - Размер операции по умолчанию

(Распознается только в дескрипторах кодового сегмента: 0=16-битовый размер; 1=32-битовый размер)

Граница: Определяет размер сегмента. Процессор помещает рядом два поля границы сегмента, в совокупности образующих одно 20-разрядное значение. Процессор интерпретирует границу одним из двух следующих способов, в зависимости от установки бита грануляции:

1. Если бит грануляции очищен, то граница может принимать значения от 1 байта до 1 мегабайта, с приращениями в один байт.

2. Если бит грануляции установлен, то граница может принимать значения от 4 Килобайт до 4 Гигабайт, с приращениями в 4 Кб.

Для большинства сегментов логический адрес может иметь значение смещения в диапазоне от 0 до значения границы. Прочие значения ведут к генерации исключений. Сегменты с расширением вниз изменяют смысл поля граница на противоположный: они позволяют адресацию любыми значениями смещения, кроме значений от 0 до значения границы (см. описание поля Типа, приводимое ниже). Это позволяет создавать сегменты, для которых увеличение значения поля Границы приводит к распределению новой памяти в нижней части адресного пространства, вместо верхней. Сегменты с расширением вниз предназначены для хранения стеков, но использовать их не обязательно. Если стек должен быть помещен в сегмент, который не будет изменять свой размер, то таким сегментом может быть обычный сегмент данных.

Бит S: Определяет, является ли этот сегмент системным сегментом, или же сегментом кода или данных. Если бит S установлен, то сегмент является либо кодовым сегментом, либо сегментом данных. Если этот бит очищен, то сегмент является системным сегментом.

Бит D: Указывает длину операндов и исполнительных адресов сегмента по умолчанию. Если бит D установлен, то предполагается режим 32-разрядных операндов и 32-разрядных исполнительных адресов. Если этот бит очищен то предполагается использование 16-разрядных операндов и адресов.

Тип: Интерпретация этого поля зависит от того, относится ли данный дескриптор к прикладному, или же к системному сегменту. Поле Типа дескриптора памяти задает тип доступа, разрешенного к данному сегменту, а также направление, в котором этот сегмент растет

Таблица 5-1. Типы прикладных сегментов

Число

E

W

A

Тип дескриптора

Описание

Данные Только чтение

Данные Только чтение, выполнен доступ

Данные Чтение/запись

Данные Чтение/запись, выполнен доступ

Данные Только чтение, расширение вниз

Данные Только чтение, расширение вниз, выполнен доступ

Данные Чтение/запись, расширение вниз

Данные Чтение/запись, расширение вниз, выполнен доступ

Число

C

R

A

Тип дескриптора

Описание

Код Только выполнение

Код Только выполнение, выполнен доступ

1Код Выполнение/чтение

1Код Ваполнение/чтение, выполнен доступ

1Код Только выполнение, конформный

1Код Только выполнение, конформный,

выполнен доступ

1Код Выполнение/только чтение, конформный

1Код Выполнение/только чтение, конформный, выполнен доступ

Для сегментов данных три младших бита поля типа можно интерпретировать как признаки расширения вниз (E), разрешения записи (W) и того, что к сегменту был выполнен доступ (A). Для кодовых сегментов три младших бита поля типа можно интерпретировать как признак конформности (C), разрешения чтения (R) и выполненного доступа (A).

Сегменты данных могут быть предназначены только для чтения или для чтения/записи. Загрузка регистра SS селектором сегмента для любого другого типа сегмента генерирует исключение общей защиты. Если стековому сегменту требуется иметь возможность изменять размер, то ему может быть назначен сегмент данных с типом расширения вниз. Для сегмента с расширением вниз смысл поля Границы меняется на противоположный. Если для других типов сегмента допустимыми являются значения смещения в диапазоне от 0 до значения границы (вне этого диапазона генерируется исключение общей защиты), то для сегмента с расширением вниз значения в этом диапазоне, напротив, ведут к генерации исключения. Допустимыми смещениями для сегментов с расширением вниз являются те, что для сегментов других типов вызывают особую ситуацию. Сегменты с расширением вверх должны адресоваться смещениями, меньшими или равными границе сегмента. Смещения же в сегменты с расширением вниз всегда должны превышать значение границы сегмента. Такая интерпретация границы сегмента вызывает распределение области памяти в нижней части сегмента, когда граница сегмента увеличивается, что является правильным для стековых сегментов, поскольку они растут в направлении младшего адреса. Если стек помещается в сегменте, который не меняет своего размера, то этот сегмент не обязан быть сегментом с расширением вниз.

Кодовые сегменты могут быть предназначены только для выполнения, либо для выполнения/чтения. Сегмент с типом "выполнение/чтение" может быть использован, например, когда в команды кода в ПЗУ помещены константы. В данном случае константы могут быть прочитаны либо при помощи команды, имеющей префикс переопределения сегмента CS, либо при помощи помещения селектора данного кодового сегмента в сегментный регистр для сегмента данных.

Кодовые сегменты могут быть либо конформными, либо не конформными. Переход выполнения в более привилегированный конформный сегмент сохранит текущий уровень привилегированности. Переход выполнения в не конформный сегмент с другим уровнем привилегированности приведет к генерации исключения общей защиты, если не использован шлюз задачи. Системные утилиты, не обращающиеся к средствам защиты, такие как функции транслирования данных (например, перекодировка EBCDIC/ASCII, кодирование / декодирование по методу Хаффмана, библиотека математических функций), а также некоторые типы исключений (например, ошибка деления на ноль, переполнение, обнаруженное при помощи INTO или превышение диапазона BOUND) могут быть загружены в конформные кодовые сегменты.

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

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

Процессор может обновлять поле Типа при доступе к сегменту, даже если доступ этот произошел в цикле чтения. Если таблицы дескрипторов были помещены в ПЗУ, аппаратному обеспечению может потребоваться запретить связь ПЗУ с шиной данных во время цикла записи. Также может потребоваться возвратить сигнал READY# процессору в цикле записи в ПЗУ; в противном случае не произойдет завершение этого цикла. Эти средства аппаратной конструкции необходимы для использования ПЗУ резидентных таблиц дескрипторов с процессором 386 DX, который всегда устанавливает бит Доступа при загрузке дескриптора сегмента. Однако, процессор i486 только в том случае, если он еще не установлен. Избежать попытки записи в таблицы дескрипторов в ПЗУ можно, установив биты Доступа в каждом дескрипторе.

DPL (Уровень привилегированности дескриптора): Определяет уровень привилегированности сегмента. Используется для управления доступом к сегменту при помощи механизма защиты.

Бит присутствия сегмента: Если этот бит очищен, то процессор при загрузке в сегментный регистр селектора данного дескриптора генерирует исключение "сегмент не присутствует". Это свойство используется для обнаружения попыток доступа к сегментам, которые стали недоступными. Сегмент может стать недоступным, когда системе понадобилось создать свободную память. Для элементов памяти, таких как символьные шрифты или драйверы устройств, в тех случаях, когда они в текущий момент не используются, выполняется отмена распределения памяти. Отмена распределения памяти такому элементу выполняется маркировкой такого сегмента как "не присутствующего" (это выполняется при помощи очистки бита присутствия сегмента). После этого память, занимаемая данным сегментом, может быть распределена для другого использования. Когда элемент, для которого было отменено распределение памяти, понадобится в следующий раз, исключение "сегмент не присутствует" укажет на то, что необходимо снова загрузить этот сегмент в память. Если такого рода организация памяти выполняется способом, не видимым для прикладных программ, то она называется "виртуальной памятью". Система может работать с общим размером виртуальной памяти, значительно превышающим физическую память, благодаря тому, что одновременно в физической памяти присутствует только несколько сегментов.

Регистр таблицы глобальных дескрипторов GDTR

Этот регистр содержит 32-битовый базовый адрес и 16-битовую границу сегмента для таблицы глобальных дескрипторов (GDT). При ссылке на данные в памяти для того, чтобы найти дескриптор сегмента в GDT или LDT используется селектор сегмента. Дескриптор сегмента содержит базовый адрес сегмента.

Регистр таблицы локальных дескрипторов LDTR

Этот регистр содержит 32-битовый базовый адрес, 16-битовую границу сегмента и 16-битовый селектор сегмента для таблицы локальных дескрипторов (LDT). Сегмент, который содержит LDT, имеет соответствующий дескриптор сегмента в GDT. Дескриптора сегмента для GDT не существует. При ссылке на данные в памяти для того, чтобы найти дескриптор сегмента в GDT или LDT используется селектор сегмента. Дескриптор сегмента содержит базовый адрес сегмента.

Регистр таблицы дескриптора прерываний IDTR

Этот регистр содержит 32-разрядный базовый адрес и 16-разрядную границу сегмента для таблицы дескрипторов прерываний. Когда происходит прерывание, вектор прерывания используется в качестве индекса для получения из данной таблицы дескриптора шлюза. Последний сдержит указатель, используемый для запуска обработчика прерываний.

Регистр задачи TR

Этот регистр содержит 32-разрядный базовый адрес, 16-разрядную границу сегмента, аттрибуты дескриптора и 16-разрядный селектор сегмента для текущей выполняемой задачи. Он содержит ссылку на дескриптор сегмента состояния задачи (TSS), находящийся в таблице глобального дескриптора.

2. Адресация таблиц дескриптора

Команда

Описание

Полезна в прикладных программах?

Защищена от прикладных программ?

LLDT

SLDT

LGDT

SGDT

Загрузка регистра LDT

Сохранение регистра LDT

Загрузка регистра GDT

Сохранение регистра GDT

Да

Да

Нет

Нет

Нет

Нет

Да

Нет

Тема 1.6. Уровни привилегий ввода-вывода, привилегированные команды.

Тема 1.7. Многозадачность.

Процессор i486 обеспечивает аппаратную поддержку мультизадачности. Задачей называется программа, выполняемая в текущий момент, либо ожидающая выполнения во время работы другой программы. Задача запускается прерыванием, исключением, переходом или вызовом. Когда одна из этих форм передачи управления используется с назначением, заданным элементом одной из дескрипторных таблиц, этот дескриптор может иметь тип, вызывающий начало выполнение новой задачи после сохранения состояния текущей задачи. Существует два типа задаче ориентированных дескрипторов, которые могут находиться в таблице дескрипторов: дескрипторы сегмента состояния задачи и шлюзы задачи. Когда управление передается любому из таких дескрипторов, происходит переключение задачи.

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

Переключение задачи передает выполнение в полностью иную среду, среду задачи. Для этого требуется сохранить содержимое практически всех регистров процессора, таких как регистр EFLAGS. В отличие от процедур, задачи не реентерабельны. Переключение задачи ничего не помещает в стек. Информация о состоянии процессора сохраняется в структуре данных в памяти, которая называется сегмент состояния задачи.

В число регистров и структур данных, поддерживающих мультизадачность, входят:

- Сегмент состояния задачи.

- Дескриптор сегмента состояния задачи.

- Регистр задачи

- Дескриптор шлюза задачи.

Используя эти структуры, процессор i486 может переключать выполнение с одной задачи на другую, сохраняя контекст текущей задачи, допуская тем самым рестарт другой задачи. Помимо простого переключения задач, процессор i486 предлагает еще два средства организации мультизадачности:

1. Переключение задачи может выполняться вследствие прерываний и исключений (если это требуется конструкции системы). Процессор не только выполняет переключение задачи для обработки прерывания или исключения, но и автоматическое переключение назад, на прерванную задачу, после возврата из прерывания или исключения. Прерывания могут происходить и во время задач обработки прерывания.

2. При каждом переключении на другую задачу процессор i486 может также выполнять переключение на другую LDT. Это может использоваться для того, чтобы дать каждой задаче собственное отображение логических адресов в физические. Тем самым обеспечивается дополнительное средство защиты, поскольку задачи могут быть таким образом изолированы, и их взаимное влияние друг на друга исключено. Регистр PDBR также перезагружается. Это позволяет использовать механизм подкачки страниц для обеспечения изолированности задач.

Использование механизма мультизадачности является необязательным. Для некоторых прикладных программ этот способ организации выполнения программ не является лучшим. При необходимости наибольшей скорости реакции на прерывания, время, которое потребуется на сохранение состояния процессора при переключении задачи может оказаться слишком большим. В этой ситуации возможный компромисс может состоять в том, чтобы использовать задаче ориентированные структуры данных, но выполнять переключение задач программными, а не аппаратными средствами. Это позволяет сохранять меньшее количество информации о состоянии процессора. Этот метод может являться одним из методов оптимизации, используемых для улучшения характеристик быстродействия системы после реализации базовых функции системы.

Сегмент состояния задачи

Информация о состоянии процессора, необходимая для восстановления контекста задачи, хранится в типе сегмента, называемом сегментом состояния задачи, или 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 по старшим адресам. Базовый адрес указывает на начало массива.

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

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10