12.5.1. Возможности адресации памяти процессорами различных поколений
Сложность обращения к памяти в PC обусловлена свойствами процессоров х86 разных поколений и требованием обратной совместимости новых процессоров и компьютеров со старым ПО.
Процессорам 8086/88 было доступно адресное пространство 1 Мбайт с диапазоном адресов 0-FFFFFh, причем физический 20-битный адрес вычислялся с помощью двух 16-битных компонентов по формуле Addr
= Seg
×16 + Offset
, где Seg
— содержимое сегментного регистра ( CS
, DS
, SS
или ES
), a Offset
— исполнительный адрес, формируемый из одного или нескольких слагаемых в соответствии с выбранным режимом адресации. Эта сегментная модель адресации позволяет программам оперировать с непрерывными блоками памяти (сегментами) размером не более 64 Кбайт. Для манипуляций с памятью большего размера требовалось переключение сегментов с помощью специальных инструкций процессора, что усложняло программирование. Заметим, что при Seg
= FFFFh и Offset
= FFFFh данная формула дает адрес 10FFEFh, но ввиду 20-битного ограничения на шину адреса эта комбинация в физической памяти указывает на 0FFEFh. Таким образом, адресное пространство как бы сворачивается в кольцо с небольшим «нахлестом».
В процессоре 80286 шина физического адреса была расширена до 24 бит, и введен новый режим работы — защищенный (Protected Mode), в котором программа может обращаться к 16-мегабайтному пространству физической памяти через логическое пространство виртуальной памяти. Здесь виртуальная память строилась на основе той же сегментной модели памяти с 16-разрядными регистрами. Физический адрес формировался суммированием 16-разрядного исполнительного адреса (смещения внутри сегмента) с 24-разрядным базовым адресом сегмента.
Кроме защищенного режима, в процессоре 80286 имеется и реальный режим, в котором процессор ведет себя почти так же, как и 8086 (но более быстрый). Здесь физический адрес вычисляется так же, как и в 8086/88, но из-за ошибки разработчиков та самая единица в бите A20, которая отбрасывалась в процессорах 8086/88, теперь попадает на шину адреса, и в результате максимально доступный физический адрес в реальном режиме достиг 10FFEFh. Для обеспечения полной совместимости с процессором 8086/88 в схему PC ввели вентиль линии A20 шины адреса — GateA20 , который либо пропускает сигнал от процессора, либо принудительно обнуляет линию A20 системной шины адреса. Этот вентиль должен быть открыт при работе в защищенном режиме, а также когда в реальном режиме нужны дополнительные (64 К-16) байт памяти. Вентиль управляется через контроллер клавиатуры (см. п. 8.1.2) или иным специфическим способом.
В 32-разрядных процессорах , начиная с 80386, сохранена та же идея обращения к памяти с участием сегментных регистров (16-разрядных), но регистры процессора, участвующие в формировании адреса, позволяют адресовать уже 2³² = 4 Гбайт памяти в каждом сегменте. Базовый адрес сегмента берется из специальных структур данных — дескрипторов сегментов . Кроме базового адреса в дескрипторе описывается его лимит (длина), назначение (код или данные), возможность записи и чтения, а также уровень привилегий программы, позволяющий обращаться к данному сегменту. Дескрипторы предварительно программно формируются в памяти, где их наборы хранятся в виде таблиц дескрипторов. Процессор имеет средства защиты памяти, контролирующие использование сегментов. Программа может обращаться лишь к тем сегментам памяти, описание которых имеется в доступных дескрипторах. Виртуальное адресное пространство, доступное программе, имеет объем до (16 К-2) сегментов (число возможных дескрипторов), каждый из которых может иметь размер до 4 Гбайт. Дескриптор выбирается с помощью селектора , загружаемого в сегментный регистр ( CS
, DS
, SS
, ES
, FS
или GS
). Однако это виртуальное адресное пространство отображается блоком сегментации в логическое адресное пространство с опять-таки 32-разрядным линейным адресом, то есть объемом 4 Гбайт. По замыслу разработчиков процессора, это отображение с подкачкой требуемых сегментов с диска и выгрузкой неиспользуемых должно выполняться диспетчером виртуальной памяти операционной системы. Практически такая виртуализация применялась на процессорах 80286 (с 16-разрядными регистрами), поскольку иных механизмов не существовало.
Для виртуализации памяти (и защиты) в 32-разрядных процессорах применяется иной механизм, основанный на блоке страничной переадресации — принципиальной новинке 32-разрядных процессоров х86. В его задачу входит отображение 32-разрядного линейного адреса (продукта блока сегментации) на 32- или 36-разрядный физический адрес, формируемый на системной шине процессора при его обращениях к памяти. В отличие от блока сегментации, оперирующего блоками разного размера (сегментами), блок страничной переадресации оперирует страницами одинакового размера. Переадресация выполняется на основе таблиц страниц , где для каждой страницы логической памяти имеется свой описатель. В этом описателе имеется признак присутствия страницы в физической памяти, и для присутствующих страниц указывается базовый адрес физического отображения. Кроме того, имеются биты, управляющие доступом к странице по чтению и записи с различных уровней привилегий, возможностью ее кэширования, и некоторые служебные биты. При обращении программы к отсутствующей странице процессор вырабатывает исключение, обработчик которого занимается подкачкой нужной страницы из внешней памяти (с диска) в ОЗУ. Этот обработчик и реализует виртуальную память с подкачкой страниц по запросу (Demand-Paged Virtual Memory), которая в настоящее время обычно и подразумевается под виртуальной памятью. При недостатке свободного места в физической памяти обработчик выполняет и замещение страниц, по его мнению, наименее нужных, выгружая их на диск. Создав несколько наборов описателей страниц, можно получить несколько виртуальных адресных пространств, каждое из которых имеет размер до 4 Гбайт, причем страницы разных пространств могут быть полностью изолированы друг от друга, а могут и частично пересекаться. В многозадачной ОС каждая задача (виртуальная машина) имеет собственное (как ей представляется) адресное пространство.
Читать дальше