Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тип книга.doc
Скачиваний:
6
Добавлен:
01.03.2025
Размер:
1.55 Mб
Скачать

Виртуальная память Pentium 4

Pentium 4 имеет сложную систему виртуальной памяти, которая поддерживает вызов страниц по требованию, чистую сегментацию и сегментацию с разбиением на страницы. Виртуальная память состоит из двух таблиц: LDT (Local Descriptor Table — локальная таблица дескрипторов) и GDT (Global Descriptor Table — глобальная таблица дескрипторов). Каждая программа имеет собственную ло­кальную таблицу дескрипторов, а единственная глобальная таблица дескрипто­ров разделяется всеми программами компьютера. Локальная таблица дескрипторов описывает локальные сегменты каждой программы (ее код, данные, стек и т. д.),а глобальная таблица дескрипторов — системные сегменты, в том числе самой операционной системы.

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


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

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

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

Формат селектора выбран таким образом, чтобы упростить поиск дескрипто­ра. Сначала на основе бита 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 байт.

Если сегмент находится в памяти, а смещение не выходит за границу сегмен­та, Pentium 4 прибавляет 32-разрядное поле BASE (базовый адрес) в дескрипто­ре к смещению, в результате чего получается линейный адрес (рис. 6.12). Поле BASE разбивается на три части и разносится по дескриптору, чтобы обеспечить совместимость с процессором 80286, в котором размер BASE составляет всего 24 бита. Поэтому каждый сегмент может начинаться с произвольного места в 32-разрядном адресном пространстве.


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

Если же разбиение на страницы разрешено, линейный адрес интерпретирует­ся как виртуальный и отображается на физический адрес с использованием таб­лиц страниц, почти как в наших примерах. Единственная сложность состоит в том, что при 32-разрядном виртуальном адресе и 32-разрядных страницах 4-ки- лобайтный сегмент может содержать 1 миллион страниц. Поэтому, чтобы сокра­тить размер таблицы страниц для маленьких сегментов, применяется двухуров­невое отображение.

Каждая работающая программа имеет специальную таблицу страниц, кото­рая состоит из 1024 32-разрядных элементов. Ее адрес указывается глобальным регистром. Каждый элемент в этой таблице указывает на таблицу страниц, кото­рая также содержит 1024 32-разрядных элементов. Элементы таблицы страниц указывают на страничные кадры. Схема изображена на рис. 6.13.


На рис. 6.13, а мы видим линейный адрес, разбитый на три поля: DIR, PAGE и OFF. Поле DIR используется в качестве индекса в каталоге страниц для нахо­ждения указателя на нужную таблицу страниц. Поле PAGE является индексом в таблице страниц при нахождении физического адреса страничного кадра. Нако­нец, поле OFF прибавляется к адресу страничного кадра, что позволяет полу­чить физический адрес нужного байта или слова.

Размер каждого элемента таблицы страниц — 32 бита, 20 из которых содер­жат номер страничного кадра. Оставшиеся биты включают бит доступа и бит

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

В каждой таблице страниц содержатся элементы для 1024 страничных кадров по 4 Кбайт каждый, поэтому одна таблица страниц может работать со значением 4 Мбайт памяти. Сегмент короче 4 Мбайт будет иметь каталог страниц с одним элементом (указателем на его единственную таблицу страниц). Таким образом, непроизводительные издержки для коротких сегментов составляют всего две страницы, а не миллион страниц, как было бы в одноуровневой таблице страниц.

Чтобы избежать повторных обращений к памяти, диспетчер памяти Pentium 4 имеет встроенную аппаратную поддержку для поиска недавно исполь­зовавшихся комбинаций полей DIR-PAGE и отображения их на физический ад­рес соответствующего страничного кадра. Действия, показанные на рис. 6.13, вы­полняются только в том случае, если текущая комбинация использовалась давно.

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

Отметим, что, если конкретное приложение не нуждается в сегментации и до­вольствуется единым 32-разрядным адресным пространством со страничной ор­ганизацией, этого легко достичь. Все сегментные регистры могут быть заполне­ны одним и тем же селектором, дескриптор которого содержит нулевое поле BASE и максимальное поле LIMIT. Смещение команды будет тогда линейным адресом с единственным адресным пространством, то есть, по сути, получается традиционное разбиение на страницы.

В завершение стоит сказать несколько слов о защите, поскольку это имеет не­посредственное отношение к виртуальной памяти. Pentium 4 поддерживает 4 уровня защиты, где уровень 0 — самый привилегированный, а уровень 3 — наи­менее привилегированный (рис. 6.14). Уровень защиты работающей программы указывается 2-разрядным полем в слове состояния программы (Program Status Word, PSW) — регистре аппаратного обеспечения, который содержит коды ус­ловий и другие биты состояния. Более того, не только программы, но и каждый сегмент в системе имеет определенный уровень защиты.

Пока программа использует сегменты только собственного уровня, все идет нормально. Доступ к данным более высокого уровня разрешается. Доступ к дан­ным более низкого уровня запрещен — в этом случае происходит исключение. Допустим вызов процедур как более высокого, так и более низкого уровня, но при этом нужно строго контролировать ситуацию. Для вызова процедуры друго­го уровня команда CALL должна содержать селектор вместо адреса. Этот селектор указывает на дескриптор, который называется шлюзом вызова (call gate) и по которому можно получить адрес нужной процедуры. Таким образом, совершить переход в середину произвольного сегмента на другом уровне невозможно. Мо­гут использоваться только официальные точки входа.


Посмотрите на рис. 6.14. На уровне 0 мы видим ядро операционной системы, которая контролирует процесс ввода-вывода, работу памяти и т. п. На уровне 1 находится обработчик системных вызовов. Пользовательские программы могут вызывать процедуры из этого уровня, но это только строго определенные про­цедуры. Уровень 2 содержит библиотечные процедуры, которые могут исполь­зоваться совместно несколькими работающими программами. Пользовательские программы могут вызывать эти процедуры, но не могут изменять их. На уров­не 3 работают пользовательские программы, которые имеют самую низкую сте­пень защиты. Система защиты Pentium 4, как и схема управления памятью, в це­лом основана на принципах системы MULTICS.

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