Главная страница Межпроцессное взаимодействие (состязание) Формат селектора сознательно продуман так, чтобы упростить определение местоположения дескриптора. Сначала выбирается локальная или глобальная таблица дескрипторов, основываясь на бите 2 селектора. Затем селектор копируется во внутренний рабочий регистр, и три младших бита сбрасываются в нули. Наконец, к нему прибавляется адрес одной из таблиц, с целью получить прямой указатель на дескриптор. Например, селектор 72 ссылается на запись 9 в глобальной таблице дескрипторов, расположенную по адресу в таблице GDT+72. Теперь проследим шаги, с помощью которых пара селектор-смещение преобразуется в физический адрес. Как только микропрограмма узнает, какой сегментный регистр используется, она может найти в своих внутренних регистрах полный дескриптор, соответствующий этому селектору. Если сегмент не существует (селектор равен 0) или в данный момент выгружен, происходит прерывание. Затем микропрограмма проверяет, выходит ли смещение за пределы сегмента, в случае чего также возникает прерывание. Логически, в дескрипторе просто должно существовать 32-разрядное поле, дающее размер сегмента, но там доступны только 20 бит, поэтому действует другая схема. Если поле Gbit (granularity - глубина детализации) равно О, то поле Limit (предел) содержит точный размер сегмента, до 1 Мбайт. Если гранулярность равна 1, поле Limit дает размер сегмента в страницах вместо байтов. Размер страницы в системе Pentium фиксирован на величине 4 Кбайт, поэтому 20 бит достаточно для сегментов размером до 2 байт. Предположим, что сегмент находится в памяти, а смещение попало в нужный интервал. Тогда Pentium прибавляет 32-разрядное поле Base (база) в дескрипторе к смещению, формируя то, что называется линейным адресом, как показано на рис. 4.27. Поле Base разбито на три части, которые разбросаны по дескриптору для совместимости с процессором Intel 80286, где поле Base имеет только 24 бита. В сущности, поле Base позволяет каждому сегменту начинаться в произвольном месте внутри 32-разрядного линейного адресного пространства. Селектор Смещение Дескриптор
32-разрядный линейный адрес Рис. 4.27. Преобразование пары селектор-смещение в физический адрес Если разбиение на страницы блокировано (с помощью бита в глобальном управляющем регистре), линейный адрес интерпретируется как физический адрес и посылается в память для чтения или записи. Таким образом, при отключенной страничной схеме памяти мы получаем чистую схему сегментации с базовым адресом каждого сегмента, выдаваемым его дескриптором. Сегментам разрешено перекрываться случайным образом, возможно потому, что контроль за тем, чтобы они не пересекались, мог бы причинить достаточно хлопот и занял бы слишком много времени. С другой стороны, если доступна страничная подкачка, линейный адрес интерпретируется как виртуальный адрес и отображается на физический адрес с помощью таблицы страниц практически так же, как в наших предыдущих примерах. Единственная серьезная трудность заключается в том, что при 32-разрядном виртуальном адресе и странице размером 4 Кбайт сегмент может содержать 1 млн страниц, поэтому используется двухуровневое отображение с целью уменьшения размера таблицы страниц для маленьких сегментов. У каждой работающей программы есть страничный каталог, состоящий из 1024 32-разрядных записей. Он расположен по адресу, хранящемуся в глобальном регистре. Каждая запись в каталоге ссылается на таблицу страниц, также содержащую 1024 32-разрядных записей. Записи в таблицах страниц, в свою очередь, указывают на страничные блоки. Эта организация продемонстрирована на рис. 4.28. Биты Линейный адрес 10 Каталог Страница Смещение Страничный каталог 1024 записей Таблица страниц Страничный блок Запись каталога указывает на таблицу каталога Запись в таблица страниц указывает на слово Рис. 4.28. Отображение линейного адреса на физический адрес На рис. 4.28, а мы видим линейный адрес, разделенный на три поля: Каталог, Страница и Смещение. Поле Каталог используется как индекс в страничном каталоге, определяющий расположение указателя на правильную таблицу страниц. Затем обрабатывается поле Страница в качестве индекса в таблице страниц, с целью найти физический адрес страничного блока. И наконец, чтобы получить физический адрес требуемого байта или слова, к адресу страничного блока прибавляется последнее поле Смещение. Каждая запись в таблице имеет размер 32 бита, двадцать из которых содержат номер страничного блока. Остальные биты - это биты доступа и грязный бит, задаваемые аппаратурой для операционной системы, биты защиты и другие полезные биты. Каждая таблица страниц включает в себя записи для 1024 страничных блоков размером по 4 Кбайт, таким образом, одна таблица страниц управляет четырьмя мегабайтами памяти. Сегмент, длина которого меньше 4 М, будет иметь страничный каталог с единственной записью - указателем на его единственную таблицу страниц. Следовательно, в случае короткого сегмента на поддержку таблиц страниц расходуется только две страницы вместо миллиона, который был бы нужен в одноуровневой таблице страниц. Чтобы избежать повторных обращений к памяти, система Pentium, как и MULTICS, имеет небольшой буфер быстрого преобразования адреса (TLB), который напрямую отображает наиболее часто используемые комбинации Каталог-Страница на физический адрес страничного блока. Только когда текущая комбинация отсутствует в TLB, действительно выполняется механизм, показанный на рис. 4.28, и TLB обновляется. Система обладает хорошей производительностью до тех пор, пока обращения к отсутствующим страницам в TLB происходят относительно редко. Также следует отметить, что когда некоторые приложения не требуют сегментации, а довольствуются единым, разбитым на страницы 32-разрядным адресным пространством, эта модель все равно работает. Все сегментные регистры могут быть настроены тем же самым селектором, в дескрипторе которого поле Base = О и поле Limit установлено на максимум. Тогда, при использовании единственного адресного пространства, смещение команды будет линейным адресом - в сущности, это обычная страничная организация памяти. Фактически все современные операционные системы для компьютера Pentium работают таким образом. Система OS/2 была единственной, которая использовала всю мощь архитектуры диспетчера памяти (MMU) фирмы Intel. В конце концов, кто-то должен похвалить разработчиков системы Pentium. При поставленных перед ними противоречивых задачах - реализовать чистую страничную организацию памяти, чистое сегментирование и страничные сегменты, и в то же время обеспечить совместимость с 286-м процессором, а кроме того, сделать все это эффективно, - результирующая структура удивительно проста и понятна. Мы, хотя и кратко, но целиком описали полную архитектуру виртуальной памяти системы Pentium, и теперь следует сказать несколько слов о защите, так как эта тема тесно связана с виртуальной памятью. Как схема виртуальной памяти, так и система защиты на Pentium близка по модели к системе MULTICS. Pentium поддерживает четыре уровня защиты, где уровень О является наиболее привилегированным, а уровень 3 - наименее привилегированным. Они показаны
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |