Танненбаум Е. Архітектура компютера [pdf]
.pdfВиртуальнаяпамять 45
уплотнения состоит в том, что на этот процесс тратится некоторое количество вр мени. Совершать уплотнение после появления каждой дырки невыгодно.
Сегмент 4 |
Сегмент 4 |
|
у/ |
|
|
(7К) |
(7К) |
Сегмент5 |
Сегмент5 |
|
|
|
|
(4К) |
(4К) |
|
|
Сегмент3 |
Сегмент 3 |
Сегмент 3 |
|
Сегмент5 |
|
(8К) |
(8К) |
(8К) |
Сегмент 6 |
||
(4К) |
|||||
|
|
|
|||
|
|
|
(4К) |
||
|
|
|
|
||
|
|
|
|
Сегмент 6 |
|
Сегмент2 |
Сегмент2 |
Сегмент2 |
Сегмент2 |
(4К) |
|
(5К) |
(5К) |
(5К) |
(5К) |
Сегмент2 |
|
|
|
|
|
||
|
'(ЗК) |
(3K) |
|
(5К) |
|
Сегмент1 |
|
|
|
|
|
(8К) |
Сегмент 7 |
Сегмент 7 |
Сегмент 7 |
Сегмент 7 |
|
|
(5К) |
(5К) |
(5К) |
(5К) |
|
СегментО |
СегментО |
СегментО |
СегментО |
СегментО |
|
(4К) |
(4К) |
(4К) |
(4К) |
(4К) |
Рис. 6.8. Динамика внешней фрагментации (а, б, в, г); удаление внешнейсегментациипутемуплотнения(д)
Если на уплотнение памяти требуется слишком много времени, нужен спец альный агоритм для определения, какую именно «дырку» лучше использовать д определенного сегмента. Для этого требуется список адресов и размеров всех «д рок». Популярный алгоритм оптимальной подгонки выбирает самую маленьку «дырку», в которую помещается нужный сегмент. Цель этого алгоритма — соотн сти «дырки» и сегменты, чтобы избежать «отламывания» куска большой «дырки который может понадобиться позже для большого сегмента.
Другой популярный алгоритм по кругу просматривает список «дырок» и выб рает первую «дырку», которая по размеру подходит для данного сегмента. Естестве но, это занимает меньше времени, чем проверка всего списка, чтобы найти опт мальную «дырку». Удивительно, но последний алгоритм гораздолучше, чем алгорит оптимальной подгонки, с точки зрения общей производительности, поскольку о тимальная подгонкапорождаеточеньмногомаленькихнеиспользованныхдырок [74
Оба алгоритма сокращают средний размер «дырки». Всякий раз, когда сегме помещается в «дырку», которая больше, чем этот сегмент, что бывает практическ всегда (точные попадания очень редки), «дырка» делится на две части. Одну час занимает сегмент, а вторая часть — это новая «дырка». Новая «дырка» всегда меньш чем старая. Без воссоздания больших «дырок» из маленьких оба алгоритма в к нечном итоге будут наполнять память маленькими неиспользованными «дырками
Виртуальная память |
4 |
Виртуальная память в процессоре Pentium II
Pentium II имеет сложную систему виртуальной памяти, которая поддержив вызов страниц по требованию, чистую сегментацию и сегментацию с разбиени на страницы. Виртуальная память состоит из двух таблиц: LDT (Local Descrip Table — локальная таблица дескрипторов) и GDT (Global Descriptor Table глобальная таблица дескрипторов). Каждая программа имеет свою собственн локальную таблицу дескрипторов, а единственная глобальная таблица дескрип ров разделяется всеми программами компьютера. Локальная таблица дескрип ров LDT описывает локальные сегменты каждой программы (ее код, данные, ст и т. д.), а глобальная таблица дескрипторов GDT описывает системные сегмен в том числе саму операционную систему.
Как мы уже говорили в главе 5, чтобы получить доступ к сегменту, Pentium сначала загружает селектор для сегмента в один из сегментных регистров. Во в мя выполнения программы регистр CS содержит селектор для сегмента кода, содержит селектор для сегмента данных и т. д. Каждый селектор представляет бой 16-битное число (рис. 6.10).
Один из битов селектора показывает, является сегмент локальным или глоба ным (то есть в какой из двух таблиц он находится: в локальной таблице дескрип ров или в глобальной таблице дескрипторов). Еще 13 битов определяют номер э мента в локальной или глобальной таблице дескрипторов, поэтому объем кажд из этих таблиц ограничен до 8 К (213) сегментных дескрипторов. Оставшиеся бита связаны с защитой. Мы опишем их позже.
Биты |
13 |
12 |
|
ИНДЕКС |
|
|
0=GDT |
Уровень привилегий (0-3) |
|
1=LDT |
|
|
|
|
|
Рис. 6.10. Селектор в машине Pentium II |
Дескриптор 0 недействителен и вызывает ловушку. Его можно загрузить в гистр сегмента, чтобы показать, что регистр сегмента в данный момент недос пен, но если попытаться использовать дескриптор 0, он вызовет ловушку.
Когда селектор загружается в сегментный регистр, соответствующий дескри тор вызывается из локальной таблицы дескрипторов или из глобальной табли дескрипторов и сохраняется во внутренних регистрах контроллера управлен памятью, поэтому к нему можно быстро получить доступ. Дескриптор состоит 8 байтов. Сюда входит базовый адрес сегмента, его размер и другая информац (рис. 6.11).
Формат селектора был выбран таким образом, чтобы упростить нахожден
Виртуальнаяпамять 457
Селектор |
Смещение |
Дескриптор
Базовый адрес
Максимальное
значение Другие поля
32-битныйлинейныйадрес
Рис. 6.12. Преобразование пары (селектор, смещение) в линейный адрес
Если разбиение на страницы блокировано (это определяется по биту в регистре глобального управления), линейный адрес интерпретируется как физический адрес и отправляется в память для чтения или записи. Таким образом, при блокировке разбиения на страницы мы имеем чистую схему сегментации, где каждый базовый адрес сегмента дан в его дескрипторе. Допускается перекрытие сегментов, поскольку было бы слишком утомительно тратить много времени на проверку, чтобы все сегменты были непересекающимися.
С другой стороны, если разбиение на страницы разрешено, линейный адрес интерпретируется как виртуальный адрес и отображается на физический адрес с использованием таблиц страниц, почти как в наших примерах. Единственная сложность состоит в том, что при 32-битном виртуальном адресе и страницах на 4 К сегмент может содержать 1 миллион страниц. Поэтому, чтобы сократить размер таблицы страниц для маленьких сегментов, применяется двухуровневое отображение.
Каждая работающая программа имеет специальную таблицу страниц, которая состоит из 1024 32-битных элементов. Ее адрес указывается глобальным регистром. Каждый элемент в этой таблице указывает на таблицу страниц, которая также содержит 1024 32-битных элементов. Элементы таблицы страниц указывают на страничные кадры. Схема изображена на рис. 6.13.
На рис. 6.13, а мы видим линейный адрес, разбитый на три поля: DIR, PAGE и OFF. Поле DIR используется в качестве индекса в директории страниц для нахождения указателя на нужную таблицу страниц. Поле PAGE используется в качестве индекса в таблице страниц для нахождения физического адреса страничного кадра. Наконец, поле OFF прибавляется к адресу страничного кадра, и получается физический адрес нужного байта или слова.
Размер каждого элемента таблицы страниц — 32 бита, 20 из которых содержат номер страничного кадра. Оставшиеся биты включают бит доступа и бит изменения, которые устанавливаются аппаратным обеспечением для помощи операционной системе, биты защиты и некоторые другие биты.
В каждой таблице страниц содержатся элементы для 1024 страничных кадров
4 5 8 Глава 6. Уровень операционной системы
|
|
Линейный адрес |
|
Биты |
10 |
10 |
12 |
|
DIR |
PAGE |
OFF |
Директория страниц |
Таблица страниц |
Страничный кадр |
||
Г |
I |
£ |
1 |
i |
t |
|
|
|
Выбранно |
|
PAGE |
|
|
DIR |
T |
|
Рис. 6.13. Отображение линейного адреса на физический адрес
Чтобы избежать повторных обращений к памяти, устройство управл мятью Pentium II содержит специальную аппаратную поддержку для по давно использовавшихся комбинаций DIR-PAGE и отображения их на кий адрес соответствующего страничного кадра. Шаги, показанные на выполняются только в том случае, если текущая комбинация не исполь недавно.
При применении разбиения на страницы значение поля BASE в дес вполне может быть равно 0. Единственное, для чего нужно поле BASE, — вировать небольшое смещение и использовать элемент в середине директо ниц, а не в начале. Поле BASE включено в дескриптор только для осуще чистой сегментации (без разбиения на страницы), а также для обратной с мости со старым процессором 80286, в котором не было разбиения на стр
Отметим, что если конкретное приложение не нуждается в сегментац вольствуется единым 32-битным адресным пространством со странично зацией, этого легко достичь. Все сегментные регистры могут быть запол ним и тем же селектором, дескриптор которого содержит поле BASE, ра поле LIMIT, установленное на максимальное значение. Смещение кома тогда линейным адресом с единственным адресным пространством — по диционное разбиение на страницы.
В завершение стоит сказать несколько слов о защите, поскольку это посредственное отношение к виртуальной памяти. Pentium II поддержива ня защиты, где уровень 0 — самый привилегированный, а уровень 3 —
Виртуальная память |
459 |
Возможные
пользователи разных уровней
"Уровень
Рис. 6.14. Уровни защиты процессора Pentium II
Пока программа использует сегменты только своего собственного уровня, все идет нормально. Доступ к данным более высокого уровня разрешается. Доступ к данным более низкого уровня запрещен1: в этом случае происходит системное прерывание (ловушка). Допустим вызов процедур как более высокого, так и более низкого уровня, но при этом нужно вести строгий контроль. Для вызова процедуры из другого уровня команда CALL должна содержать селектор вместо адреса. Этот селектор обозначает дескриптор, который выдает адрес нужной процедуры. Таким образом, невозможно совершить переход в середину произвольного сегмента на другом уровне. Могут использоваться только официальные точки входа.
Рассмотрим рис. 6.14. На уровне 0 мы видим ядро операционной системы, которая контролирует процесс ввода-вывода, работу памяти и т. п. На уровне 1 находится обработчик системных вызовов. Пользовательские программы могут вызывать процедуры из этого уровня, но только строго определенные процедуры. Уровень 2 содержит библиотечные процедуры, которые могут разделяться несколькими работающими программами. Пользовательские программы могут вызывать эти процедуры, но не могут изменять их. На уровне 3 работают пользовательские программы, которые имеют самую низкую степень защиты. Система защиты Pentium II, как и схема управления памятью, в целом основана на идеях системы MULTICS.
Ловушки и прерывания используют механизм, сходный сописанным выше. Они тоже обращаются к дескрипторам, а не к абсолютным адресам, а эти дескрипторы указывают на процедуры, которые нужно выполнить. Поле FIELD на рис. 6.11 служит для различения сегментов кода, сегментов данных и различных типов логических элементов.
Виртуальная память |
46 |
вызывает его контекст, виртуальный адрес в этом контексте передается в контро лер управления памятью, то он с помощью специальной схемы сравнивает ном виртуальной страницы со всеми элементами буфера быстрого преобразовани адреса TLB для данного контекста одновременно. Если обнаруживается совпад ние, номер страничного кадра в этом элементе буфера соединяется со смещен ем, взятым из виртуального адреса, чтобы получить 41-битный физический адр и обработать некоторые флаги (например, биты защиты). Буфер быстрого прео разования адресаТЬВ изображен на рис. 6.16, а.
|
TLB (контроллер |
|
TLB (контроллер |
|
|
управления памятью + |
|
||
|
управления памятью) |
программное обеспечение ] |
|
|
|
и |
го |
го |
|
|
о i |
|
||
ш е |
со, Б |
ё |
¥иi |
Транслирующаятаблиц |
|
I s |
|
|
(операционная система |
1 |
|
ш |
|
|
|
|
|
|
Формат |
|
|
|
|
полностью |
|
|
|
|
определяется |
|
Элемент 0 совместно |
|
операционной |
|
|
используется всеми |
Элемент 1 совместно |
системой |
виртуальными страницами, |
I |
|
|
||
заканчивающимися |
используется всеми |
|
виртуальными страницами, |
||
на 0...0000 |
||
заканчивающимися |
||
|
||
|
на 0...0001 |
Рис.6.16.Структурыданных, использующиесядлятрансляции виртуальногоадреса на UltraSPARC II: буфер быстрого преобразования адреса TLB (а); буфер хранения преобразований (б);транслирующаятаблица(в)
Если совпадение не обнаружилось, происходит промах в TLB, который выз вает ловушку в операционной системе. Обрабатывать ошибку должна сама опер ционная система. Отметим, что данный промах отличается от ошибки из-за отсу ствия страницы. Промах буфера TLB может произойти, даже если нужная страни
присутствует в памяти. Теоретически операционная система может сама загр
4 6 2 Глава 6. Уровень операционной системы
(TSB — translationstorage buffer). Этатаблицапостроенакак кэш-память отбражения виртуальных страниц. Каждый 16-байтный элемент данной указывает на одну виртуальную страницу и содержит бит достоверности контекста,тегвиртуального адреса, номер физической страницы и нескольк вых битов. Если размер кэш-памяти составляет, скажем, 8192 элемента, т виртуальные страницы, у которых младшие 13 битов отображаются в 000000 будут претендовать на элемент 0 в данной таблице. Точно так же все вирт страницы, у которых младшие биты отображаются в 0000000000001, пре на элемент 1 в этой таблице, как показано на рис. 6.16, б. Размер таблицы ляется программным обеспечением и передается в контроллер управлени тью через специальные регистры, доступные только для операционной си
При промахе буфера хранения преобразований операционная систем ряет, содержит ли соответствующий элемент буфера TLB нужную вирт страницу. Контроллер управления памятью вычисляет адрес этого элемен мещает его в свой внутренний регистр, доступный для операционной систем нужный элемент есть в таблице хранения преобразований, то какой-ниб мент удаляется из буфера TLB, а соответствующий элемент буфера хране образований копируется туда. Аппаратное обеспечение с помощью алгорит выбирает, какой именно элемент нужно выкинуть.
Если нужной виртуальной страницы нет в кэш-памяти, операционная использует другую таблицу для нахождения информации о странице, кот жет находиться или не находиться в основной памяти. Таблица, которая п ется для этого поиска, называется транслирующей таблицей. Поскольку з паратное обеспечение не участвует в поиске элементов, операционная может использовать любой формат. Например, она может хэшировать но туальной страницы, разделив его на какое-либо число р, и использовать для индексирования таблицы указателей, каждый из которых указывает на список виртуальных страниц, разделенных на р. Отметим, что эти элем не собственно страницы, а элементы таблицы TSB. Если поиск страницы це трансляции привел к нахождению нужной страницы в памяти, то элем в кэш-памяти обновляется. Если в результате поиска обнаружилось, что страницы нет в памяти, то происходит стандартная ошибка.
Сравним схемы разбиения настраницы в Pentium II и UltraSPARC И. P поддерживает чистую сегментацию, чистое разбиение на страницы и сегм в сочетании с разбиением на страницы. UltraSPARC II поддерживает тол биение на страницы. Pentium II использует аппаратное обеспечение для грузки элемента буфера TLB в случае промаха TLB. UltraSPARC II в случ промаха просто передает управление операционной системе.
Причинаэтого различия состоит в том, что Pentium II использует 32-би менты, а такие маленькие сегменты (только 1 млн страниц) могут обраба только с помощью страничных таблиц. Теоретически у Pentium II могли никнуть проблемы, если бы программа использовала тысячи сегментов, н
ни одна из версий Windows или UNIX не поддерживает более одного сег