Реклама:

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

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

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

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

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

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

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

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

Рис. 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 байт.

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

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

Рис. 6.12. Преобразование пары селектор-смещение в линейный адрес

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

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

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

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

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

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

Рис. 6.14. Уровни защиты процессора Pentium 4

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

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

Реализация сегментации || Оглавление || Виртуальная память UltraSPARC III