Э. Таненбаум - Архитектура компьютера (1127755), страница 123
Текст из файла (страница 123)
Одну часть занимает сегмент, а вторая часть превращается в новый свободный фрагмент, который по определению меньше, чем прежний. Без дефрагментации (превращения всех маленьких пустот в одну большую) оба алгоритма в конечном итоге приведут к заполнению памяти пустотами, слишком маленькими даже для самого мелкого сегмента. Опишем один из таких процессов. Всякий раз, когда сегмент удаляется из памяти, а одна или обе соседние области этого сегмента — не сегменты, а пустоты, смежные пустоты можно объединить. Если на рис. 6.8, г удалить сегмент 5, то две соседние пустбты, объединившись с фрагментом размером 4 Кбайт, который занимал удаленный сегмент, дадут в результате свободный фрагмент размером уже 11 Кбайт.
В начале этого подраздела мы говорили о том, что реализовать сегментацию можно двумя способами: подкачкой сегментов и разбиением на страницы. До сих пор речь шла о подкачке. При таком подходе по необходимости между памятью и диском перемещаются целые сегменты. Второй способ реализации — разделить каждый сегмент на страницы фиксированного размера и вызывать их по требованию.
В этом случае одни страницы сегмента могут находиться в памяти, а другие — на диске. Чтобы разбить сегмент на страницы, для каждого сегмента нужна отдельная таблица страниц. Поскольку сегмент представляет собой линейное адресное пространство, все варианты разбиения на страницы, которые мы до сих пор рассматривали, применимы к любому сегменту. Единственное отличие состоит в том, что каждый сегмент получает отдельную таблицу страниц. 492 Глава 6. Уровень операционной системы МШ.Т1СЯ (Ми1Г1р1ехес1 1п1огшат1оп апг1 Сошрийпй ашетт)се — служба общей информации и вычислений) — это древняя операционная система, совмещающая сегментацию с разбиением на страницы.
Она была разработана Массачусетским технологическим институтом совместно с компаниями Вей 1.аЪз и Сепега1 Е!естпс [49, 1551. Адреса в МП1.Т!СЯ состоят из двух частей: номера сегмента и адреса внутри сегмента. Для каждого процесса существовал дескрипторный сегмент, содержащий дескрипторы каждого сегмента. При аппаратном получении виртуального адреса для нахождения дескриптора нужного сегмента номер сегмента использовался в качестве индекса в дескрипторном сегменте (рис.
6.9). Дескриптор указывал на таблицу страниц, что позволяло разбивать на страницы каждый сегмент обычным способом. Для повышении производительности недавно использованные сочетания сегментов и страниц помещались в ассоциативную память из 16 элементов. Операционная система М1Л.Т1СЯ уже давно не применяется, но виртуальная память всех процессоров 1пте1, начиная с 386, очень похожа на эту систему. Составной Мс!~Т!СЗ-адрес Рис.
6.9. Преобразование соотавного М0! Т!СЗ-адреса в адрес основной памяти Виртуальная память Репбит 4 Рептшш 4 имеет сложную систему виртуальной памяти, которая поддерживает вызов страниц по требованию, чистую сегментацию и сегментацию с разбиением на страницы. Виртуальная память состоит из двух таблиц: ЕРТ (Еоса1 1)езсг1ргог ТаЫе — локальная таблица дескрипторов) и 01ЭТ (01оЪа! Пезсг1ртог ТаЫе— глобальная таблица дескрипторов). Каждая программа имеет собственную локальную таблицу дескрипторов, а единственная глобальная таблица дескрипторов разделяется всеми программами компьютера.
Локальная таблица дескрипторов описывает локальные сегменты каждой программы (ее код, данные, стек и т. д.), Виртуальная память 493 а глобальная таблица дескрипторов — системные сегменты, в том числе самой операционной системы. Как уже отмечалось в главе 5, чтобы получить доступ к сегменту, Репгшш 4 сначала загружает селектор сегмента в один из сегментных регистров. Во время выполнения программы регистр СЯ содержит селектор сегмента кода, Р8 — селектор сегмента данных и т.
д. Каждый селектор представляет собой 16-разрядное число (рис. 6.10). Биты 1З 1 г Уровень привилегий 10-3) Рис. 6.10. Селектор Реп1)огп 4 Один из битов селектора показывает, является сегмент локальным или глобальным (то есть к какой из двух таблиц дескрипторов, локальной или глобальной, он относится). Е1це 13 бит определяют номер элемента в локальной или глобальной таблице дескрипторов, поэтому объем каждой из этих таблиц ограничен значением 8 Кбайт (2'3) сегментных дескрипторов. Оставшиеся два бита связаны с защитой. Мы опишем их позже.
Дескриптор О недействителен и вызывает исключение. Его можно загрузить в регистр сегмента, чтобы показать, что регистр сегмента недоступен, но если попытаться использовать дескриптор О, будет вызвано исключение. Когда селектор загружается в сегментный регистр, соответствующий дескриптор вызывается из локальной или глобальной таблицы дескрипторов и сохраняется во внутренних регистрах диспетчера памяти, поэтому к нему можно быстро получить доступ. Дескриптор состоит из 8 байт. Сюда входит базовый адрес сегмента, его размер и другая информация (рис. 6.11).
Относительный адрес 32 бита -3) 1— в ует в памяти вует в памяти 0 — 1 1 — 3 сегмент Рнс. 6.11. Дескриптор сегмента кода Репбогп 4. Сегменты данных практически ничем не различаются 494 Глава 6. Уровень операционной системы Формат селектора выбран таким образом, чтобы упростить поиск дескриптора. Сначала на основе бита 2 в селекторе выбирается локальная или глобальная таблица дескрипторов. Затем селектор копируется во временный регистр диспетчера памяти, а три младших бита принимают значение 0 — в результате 13-разрядное число селектора умножается на 8. Наконец, к этому значению прибавляется адрес из локальной или глобальной таблицы дескрипторов (который хранится во внутренних регистрах диспетчера памяти), и в результате получается указатель на дескриптор.
Например, селектор 72 обращается к элементу 9 в глобальной таблице дескрипторов, который находится в ячейке с адресом СПТ+ 72. Давайте проследим, каким образом пара (селектор, смещение) превращается в физический адрес. Как только аппаратно определяется, какой именно регистр сегмента используется, во внутренних регистрах можно найти полный дескриптор, соответствующий данному селектору. Если такого сегмента не существует (селектор 0), или в данный момент он не находится в памяти (Р = 0), вызывается исключение. В первом случае это — программная ошибка; второй случай требует, чтобы операционная система вызвала нужный сегмент.
Затем аппаратно проверяется, не выходит ли смещение за пределы сегмента. Если выходит, то снова вызывается исключение. По логике вещей в дескрипторе должно быть 32-разрядное поле для определения размера сегмента, но там в наличии имеется всего 20 бит, поэтому в данном случае используется совершенно другая схема. Если поле С (Стаи!аг)1у — степень детализации) равно О, то поле Е1М!Т (максимальное значение) дает точный размер сегмента (до 1 Мбайт).
Если поле С равно 1, то поле 1.1М1Т указывает размер сегмента в страницах, а не в байтах. Размер страницы в компьютере Репсшш 4 никогда не бывает меньше 4 Кбайт, поэтому 20 бит достаточно для сегментов размером до 2зз байт. Если сегмент находится в памяти, а смещение не выходит за границу сегмента, Репг1пш 4 прибавляет 32-разрядное поле ВАЗЕ (базовый адрес) в дескрипторе к смещению, в результате чего получается линейный адрес (рис. 6.12). Поле ВАЗЕ разбивается на три части и разносится по дескриптору, чтобы обеспечить совместимость с процессором 80286, в котором размер ВАКЕ составляет всего 24 бита.
Поэтому каждый сегмент может начинаться с произвольного места в 32-разрядном адресном пространстве. 32-разрядный линейный адрес Рис. б.12. Преобразование пары селектор-смещение в линейный адрес Виртуальная память 495 Если разбиение на страницы блокировано (это определяется по биту в глобальном регистре управления), линейный адрес интерпретируется как физический адрес и отправляется в память для чтения или записи. Таким образом, при блокировке разбиения на страницы мы имеем «чистую» схему сегментации, где каждый базовый адрес сегмента присутствует в его дескрипторе.
Допускается перекрытие сегментов, поскольку было бы слишком утомительно тратить много времени на проверку того, что сегменты непересекающиеся. Если же разбиение на страницы разрешено, линейный адрес интерпретируется как виртуальный и отображается на физический адрес с использованием таблиц страниц, почти как в наших примерах. Единственная сложность состоит в том, что при 32-разрядном виртуальном адресе и 32-разрядных страницах 4-килобайтный сегмент может содержать 1 миллион страниц.
Поэтому, чтобы сократить размер таблицы страниц для маленьких сегментов, применяется двухуровневое отображение. Каждая работающая программа имеет специальную таблицу страниц, которая состоит из 1024 32-разрядных элементов. Ее адрес указывается глобальным регистром. Каждый элемент в этой таблице указывает на таблицу страниц, которая также содержит 1024 32-разрядных элементов. Элементы таблицы страниц указывают на страничные кадры. Схема изображена на рис. 6.13. Линейный адрес 10 12 Биты 10 Таблица страниц Каталог страниц Страничный кадр Выбранное слово О!й рис.
6.13. Отображение линейного адреса на физический На рис. 6.13, а мы видим линейный адрес, разбитый на три поля: О1К, РАСЕ и ОРГ. Поле П1К используется в качестве индекса в каталоге страниц для нахождения указателя на нужную таблицу страниц. Поле РАСЕ является индексом в таблице страниц при нахождении физического адреса страничного кадра. Наконец, поле ОГГ прибавляется к адресу страничного кадра, что позволяет получить физический адрес нужного байта или слова. Размер каждого элемента таблицы страниц — 32 бита, 20 из которых содержат номер страничного кадра. Оставшиеся биты включают бит доступа и бит 496 Глава 6.
Уровень операционной системы изменения, которые устанавливаются аппаратно, чтобы помочь операционной системе, биты защиты и некоторые другие. В каждой таблице страниц содержатся элементы для 1024 страничных кадров по 4 Кбайт каждый, поэтому одна таблица страниц может работать со значением 4 Мбайт памяти. Сегмент короче 4 Мбайт будет иметь каталог страниц с одним элементом (указателем на его единственную таблицу страниц). Таким образом, непроизводительные издержки для коротких сегментов составляют всего две страницы, а не миллион страниц, как было бы в одноуровневой таблице страниц. Чтобы избежать повторных обращений к памяти, диспетчер памяти Репг1пш 4 имеет встроенную аппаратную поддержку для поиска недавно использовавшихся комбинаций полей П1К-РАСЕ и отображения их на физический адрес соответствующего страничного кадра.