Таненбаум Э.- Архитектура компьютера. стр.346

а глобальная таблица дескрипторов — системные сегменты, в том числе самой операционной системы.

Как уже отмечалось в главе 5, чтобы получить доступ к сегменту, Pentium 4 сначала загружает селектор сегмента в один из сегментных регистров. Во время выполнения программы регистр CS содержит селектор сегмента кода, DS — селектор сегмента данных и т. д. Каждый селектор представляет собой 16-разрядное число (рис. 6.10).

Таненбаум Э.- Архитектура компьютера.

Рис. 6.10. Селектор Pentium 4

Один из битов селектора показывает, является сегмент локальным или глобальным (то есть к какой из двух таблиц дескрипторов, локальной или глобальной, он относится). Еще 13 бит определяют номер элемента в локальной или глобальной таблице дескрипторов, поэтому объем каждой из этих таблиц ограничен значением 8 Кбайт (213) сегментных дескрипторов. Оставшиеся два бита связаны с защитой. Мы опишем их позже.

Дескриптор 0 недействителен и вызывает исключение. Его можно загрузить в регистр сегмента, чтобы показать, что регистр сегмента недоступен, но если попытаться использовать дескриптор 0, будет вызвано исключение.

Когда селектор загружается в сегментный регистр, соответствующий дескриптор вызывается из локальной или глобальной таблицы дескрипторов и сохраняется во внутренних регистрах диспетчера памяти, поэтому к нему можно быстро получить доступ. Дескриптор состоит из 8 байт. Сюда входит базовый адрес сегмента, его размер и другая информация (рис. 6.11).

Таненбаум Э.- Архитектура компьютера.

Рис. 6.11. Дескриптор сегмента кода Pentium 4. Сегменты данных практически ничем

не различаются

Формат селектора выбран таким образом, чтобы упростить поиск дескриптора. Сначала на основе бита 2 в селекторе выбирается локальная или глобальная таблица дескрипторов. Затем селектор копируется во временный регистр диспетчера памяти, а три младших бита принимают значение 0 — в результате 13-разрядное число селектора умножается на 8. Наконец, к этому значению прибавляется адрес из локальной или глобальной таблицы дескрипторов (который хранится во внутренних регистрах диспетчера памяти), и в результате получается указатель на дескриптор. Например, селектор 72 обращается к элементу 9 в глобальной таблице дескрипторов, который находится в ячейке с адресом GDT + 72.

Давайте проследим, каким образом пара (селектор, смещение) превращается в физический адрес. Как только аппаратно определяется, какой именно регистр сегмента используется, во внутренних регистрах можно найти полный дескриптор, соответствующий данному селектору. Если такого сегмента не существует (селектор 0), или в данный момент он не находится в памяти (Р = 0), вызывается исключение. В первом случае это — программная ошибка; второй случай требует, чтобы операционная система вызвала нужный сегмент.

Затем аппаратно проверяется, не выходит ли смещение за пределы сегмента. Если выходит, то снова вызывается исключение. По логике вещей в дескрипторе должно быть 32-разрядное поле для определения размера сегмента, но там в наличии имеется всего 20 бит, поэтому в данном случае используется совершенно другая схема. Если поле G (Granularity — степень детализации) равно 0, то поле LIMIT (максимальное значение) дает точный размер сегмента (до 1 Мбайт). Если поле G равно 1, то поле LIMIT указывает размер сегмента в страницах, а не в байтах. Размер страницы в компьютере Pentium 4 никогда не бывает меньше 4 Кбайт, поэтому 20 бит достаточно для сегментов размером до 232 байт.


⇐ Предыдущая страница| |Следующая страница ⇒