Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Танненбаум Е. Архітектура компютера [pdf]

.pdf
Скачиваний:
103
Добавлен:
02.05.2014
Размер:
5.59 Mб
Скачать

Виртуальнаяпамять 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 5 4 Глава 6. Уровень операционной системы

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

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

MULTICS (Multiplexed Information and Computing Service — служ информации и вычислений) — это древняя операционная система, котора щала сегментацию с разбиением на страницы. Она была разработана сетским технологическим институтом совместно с компаниями Bell Labs Electric [28, 106]. Адреса в MULTICS состоят из двух частей: номера се адреса внутри сегмента. Для каждого процесса существовал сегмент деск который содержал дескриптор для каждого сегмента. Когда аппаратное о ние получало виртуальный адрес, номер сегмента использовался в каче декса в сегмент дескриптора для нахождения дескриптора нужного (рис. 6.9). Дескриптор указывал на таблицу страниц, что позволяло разб страницы каждый сегмент обычным способом. Для повышения производ сти недавно используемые комбинации сегмента и страницы помещалис циативную память из 16 элементов. Операционная система MULTICS у не применяется, но виртуальная память всех процессоров Intel, начиная очень похожа на эту систему.

10-битное сме

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

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).

Формат селектора был выбран таким образом, чтобы упростить нахожден

4 5 6 Глава 6. Уровень операционной системы

ров или из глобальной таблицы дескрипторов (который хранится во внут регистрах контроллера управления памятью), и в результате получается ук на дескриптор. Например, селектор 72 обращается к элементу 9 в глобальн лице дескрипторов, который находится в ячейке с адресом GDT+72.

• 32бита

 

Относите

 

—•- адре

BASE 0-15

LIMIT

 

BASE 24-31 G D О LIMIT 16-19 P DPL

TYPE

BASE 16-23

0: содержимое поля"

Типсегмента изащита

LIMIT в байтах

Уровеньпривилегий(0-3)

1:содержимоеполя

 

 

LIMIT в страницах

0: Сегмент отсутствует в па

0:16-битный

1: Сегмент присутствует в п

 

 

сегмент

 

 

1: 32-битный сегмент

Рис. 6 . 1 1 . Дескриптор сегмента кода в процессоре Pentium II. Сегментыданныхпрактически ничем не различаются

Давайте проследим, каким образом пара (селектор, смещение) превра

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

Затем аппаратное обеспечение проверяет, не выходит ли смещение за п сегмента. Если выходит, то снова происходит ловушка. По логике веще скрипторе должно быть 32-битное поле для определения размера сегмента,

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

Если сегмент находится в памяти, а смещение не выходит за границу се Pentium II прибавляет 32-битное поле BASE в дескрипторе к смещению

Виртуальнаяпамять 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 служит для различения сегментов кода, сегментов данных и различных типов логических элементов.

4 6 0

Глава 6. Уровень операционной системы

Виртуальная память UltraSPARC II

UltraSPARC II — это 64-разрядная машина, которая поддерживает вирту память со страничной организацией и с 64-битными виртуальными адреса не менее по разным причинам программы не могут использовать полное ное виртуальное адресное пространство. Поддерживается только 64 бита, программы не могут превышать 1,8х1013 байтов. Допустимая виртуальная делится на 2 зоны по 243 байтов каждая, одна из которых находится в верх ти виртуального адресного пространства, а другая — в нижней. Между ним дится «дырка», содержащая адреса, которые не используются. Попытка ис вать их вызовет ошибку из-за отсутствия страницы.

Максимальная физическая память компьютера UltraSPARC II составляет тов (2200 Гбайт). Поддерживается 4 размера страниц: 8 Кбайт, 64 Кбайт, 51 и 4 Мбайт. Отображения этих четырех размеров показаны на рис. 6.15.

Биты

51

13

48

16

45

19

42

22

 

 

 

 

 

Ч

 

Ч

 

ьнои

7i

ние

Q.

 

 

1

О

i

 

 

аниц

CD

 

 

 

2

 

ш

 

CJ

 

 

 

I

 

I

ничный

S

щение

 

 

CD Q.

Q.я 2

оо

о.g*

ние

о *4

CD

CD ^

CD

2

S g-

О

I

 

I

ный

3

ние

 

 

CD

X

о.

=1

CD

 

CD

а.СО

2

О

 

О

 

 

Q.

ИОНK512

эи н

ниць

 

О

CD

 

 

 

 

ВИ1 стра

5

 

О

 

 

I J

И1 Я

CN

CD

 

т Ю

X

X

О.

CD

CD

 

а.

2

6

 

О

 

 

Q.

ИОН

 

 

 

zs

О

 

S

 

1CDX

 

ВИ|

&

 

 

ние CD

О

Биты

28

13

25

16

22

19

19

22

Рис. 6.15. Отображения виртуальных адресов в физические в машине UltraSPAR

Из-за огромного виртуального адресного пространства обычная табли ниц (как в Pentium II) не будет практичной. В UltraSPARC II применяетс шенно другой подход. Устройство управления памятью содержит табли называемый TLB (Translation Lookaside Buffer — буфер быстрого преоб ния адреса). Эта таблица отображает номера виртуальных страниц в ном зических страничных кадров. Для страниц размером в 8 К существует 231 н виртуальных страниц, то есть более двух миллиардов. Естественно, не все

гут быть отображены.

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

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 не поддерживает более одного сег

Соседние файлы в предмете Аппаратное обеспечение ЭВМ, средств телекоммуникаций и сетей