
Формирование линейного адреса в реальном режиме.
Рассмотрим процесс формирования физического (линейного) адреса в реальном режиме.
В реальном режиме сегментные регистры процессора содержат старшие 16 бит физического адреса начала сегмента. Максимальное значение, которое могут содержать 16-битные регистры, составляет 216-1 или 64 Кбайт. Но адресное пространство реального режима составляет 1 Мбайт.
Возникает вопрос о том, как адресовать остальную часть оперативной памяти вплоть до 1 Мбайта, если размер самого сегмента не превышает 64 Кбайт. Чтобы организовать работу с мегабайтным адресным пространством памяти, используется искусственное выделение из адресного пространства сегментов по 64К (так как в таком объеме мы можем использовать шестнадцатиразрядные адреса). Недостающие младшие четыре бита 20-битного адреса получаются сдвигом значения в сегментном регистре на 4 разряда влево.
Физический адрес получается путем сложения этого адреса с 16-разрядным значением смещения в сегменте, формируемого по заданному режиму адресации для операнда или извлекаемому из регистра IP для команды
Рис.3.2 Формирование физического адреса памяти из адреса сегмента и смещения.
На рисунке видно, что сегментная часть извлекается из одного из сегментных регистров, сдвигается на четыре разряда влево и суммируется со смещением. Получившиеся 20-битное значение и является настоящим физическим адресом, соответствующим началу сегмента.
Процедура умножения сегментного адреса на 16 (или, что то же самое, на 10h) является принципиальной особенностью реального режима, ограничивающей диапазон адресов, доступных в реальном режиме, величиной 1 Мбайт. Действительно, максимальное значение сегментного адреса составляет FFFFh, или 64К-1, из чего следует, что максимальное значение начального адреса сегмента в памяти равно FFFF0h, или 1 Мбайт - 16. Если, однако, учесть, что к начальному адресу сегмента можно добавить любое смещение в диапазоне от 0 до FFFFh, то адрес последнего адресуемого байта окажется равен 10FFEFh, что соответствует величине 1 Мбайт + 64 Кбайт - 17.
Формирование линейного адреса в защищенном режиме
При переходе к 32-разрядной архитектуре стало необходимым обеспечить возможность адресации памяти емкостью до 232 байт. Кроме того, введение защищенного режима работы микропроцессора потребовало хранения большого количества дополнительной информации о сегменте: его длине, которая стала переменной, уровне привилегий, его типе и т. д. Простое увеличение разрядности сегментных регистров до 32 бит не обеспечило бы возможности хранения всей этой информации. Поэтому все данные о сегменте стали размещаться в специальных структурах - дескрипторах (описателях) сегментов, которые хранятся в таблицах дескрипторов, расположенных в памяти, а сегментные регистры, сохранив свою первоначальную длину в 16 разрядов, содержат так называемый селектор (указатель), который используется для того, чтобы найти нужный дескриптор в этих таблицах.
Рис.3.3. Формирование линейного адреса в защищенном режиме
Существуют две обязательные дескрипторные таблицы - глобальная (GDT) и дескрипторная таблица прерывания (IDT), а также множество (до 8192) локальных дескрипторных таблиц (LDT), из которых в один момент времени процессору доступна только одна. Дескрипторы сегментов могут находиться в GDT или LDT. Расположение дескрипторных таблиц определяется регистрами процессора GDTR (Global Descriptor Table Register), IDTR (Interrupt Descriptor Table Register), LDTR (Local Descriptor Table Register).
Регистры GDTR и IDTR - 6-байтные, они содержат 32 бита линейного базового адреса дескрипторной таблицы и 16 бит предела таблицы.
Программно доступная часть регистра LDTR - 16 бит, которые являются селектором LDT. Дескрипторы LDT находятся в GDT. Однако чтобы не обращаться каждый раз к GDT, в процессоре имеется теневая (программно недоступная) часть регистра LDTR, в которую процессор помещает дескриптор LDT при каждой перегрузке селектора в регистре LDTR.
Значение сегментного регистра (селектор) содержит индекс дескриптора в дескрипторной таблице; бит, определяющий, к какой дескрипторной таблице производится обращение LDT (TI = 1) или GDT (TI = 0); а также запрашиваемые права доступа к сегменту PRL.
Для вычисления линейного адреса МП выполняет следующие действия:
МП использует селектор сегмента для нахождения дескриптора сегмента. Селектор содержит индекс дескриптора в дескрипторной таблице (Index), бит TI, определяющий, к какой дескрипторной таблице производится обращение (LDT или GDT), а также запрашиваемые права доступа к сегменту (RPL). Если селектор хранится в сегментном регистре, то обращение к дескрипторным таблицам происходит только при загрузке селектора в сегментный регистр, т. к. каждый сегментный регистр хранит соответствующий дескриптор в программно-недоступном ("теневом") регистре-кэше.
МП анализирует дескриптор сегмента, контролируя права доступа (сегмент доступен с текущего уровня привилегий) и предел сегмента (смещение не превышает предел);
МП добавляет смещение к базовому адресу сегмента и получает линейный адрес.