Выбрать главу

Первоначально блок страничной переадресации работал со страницами размером 4 Кбайт. В дополнение к этому базовому механизму в процессор Pentium ввели возможность работы и со страницами размером 4 Мбайт (режим PSE). В ряде процессоров P6 разрядность физического адреса увеличена до 36 бит, и все процессоры P6 имеют возможность включение режима переадресации РАЕ, позволяющего отображать страницы размером 4 Кбайт и 2 Мбайт с расширением физического адреса. С процессорами Pentium III появился режим преобразования PSE-36, в котором блок оперирует 4-Мбайтными страницами в 36-битном физическом пространстве и сохраняется возможность работы со стандартными 4-Кбайтными страницами базового режима. Это позволяет довольно эффективно управляться с современными объемами физической памяти компьютера.

В стандартном реальном режиме 32-разрядные процессоры работают с памятью так же, как и 80286, с возможностью адресации в диапазоне 0-10FFEFh, причем вентиль Gate A20 ввели уже в сам процессор. Физический адрес вычисляется с участием сегментных регистров, размер непрерывного сегмента — 64 Кбайт. По умолчанию в реальном режиме адреса формируются с использованием только младших 16 бит 32-разрядных регистров, правда, для каждой инструкции можно с помощью префиксов изменить разрядность адресных компонентов на 32 бита. Однако и при этом невозможно пересечь границу 64-Кбайтного сегмента — сработает исключение защиты. В стандартном реальном режиме блок страничной переадресации не работает, и физический адрес совпадает с линейным. С помощью временного переключения в защищенный режим можно настроить таблицы страниц, разрешить преобразование и далее в реальном режиме задействовать страничное преобразование. Этот трюк используется менеджерами памяти типа EMM386 для работы со свободными блоками UMA.

Есть и еще один режим, неофициальный, но тоже работающий на всех 32-разрядных процессорах х86, — «нереальный» (unreal), он же «большой реальный» (big real). Он позволяет процессору в реальном режиме обращаться к данным, расположенным в любом месте 4-Гбайтного пространства линейных (и физических) адресов. Этот режим базируется на логике блока сегментации, которая при вычислении линейного адреса во время обращений к памяти пользуется скрытыми программно-недоступными регистрами дескрипторов сегментов. Из этих регистров берется базовый адрес, из них же берется и лимит, который используется схемой защиты. В этих регистрах кэшируются дескрипторы сегментов, загружаемые из памяти во время исполнения инструкций, переопределяющих значения сегментных регистров (CS, DS, SS, ES, FS и GS) в защищенном режиме. По аппаратному сбросу в эти скрытые регистры заносятся «неинтересные» параметры стандартного реального режима, с лимитом 64 Кбайт. В реальном режиме при переопределении сегментных регистров значение базового адреса берется как 16-кратное значение, загружаемое в соответствующий сегментный регистр, а лимит устанавливается в 64 Кбайт. Тем не менее, если в защищенном режиме в сегментный регистр загрузить селектор дескриптора, в котором описан сегмент размером 4 Гбайт с нулевым базовым адресом и возможностью полного доступа на любом уровне привилегий, переключиться в реальный режим и не трогать этот сегментный регистр, то далее процессор будет иметь доступ ко всему этому сегменту в данной модификации реального режима. Однако такая «благодать» распространяется только лишь на доступ к данным через сегментные регистры FS и GS, которые используются в инструкциях обращений к памяти, снабженных префиксами замены сегмента. Эти сегментные регистры появились только с 32-разрядными процессорами, и никакие традиционные сервисы BIOS (и DOS) их не затрагивают. Остальные сегментные регистры настолько часто используются, что «время жизни» описания большого сегмента в их кэширующих регистрах будет слишком коротким. Программный код, увы, исполняется только из сегмента, которым командует CS, поэтому для него остается лишь первый мегабайт с 64-Кбайтными сегментами. Так что большие программные модули приходится подгружать в эту область по мере надобности, но это можно выполнять довольно быстро пересылками данных из любого места «большого сегмента». Большой реальный режим широко используется менеджерами памяти, а также игровыми DOS-программами, всецело захватывающими ресурсы компьютера.

Итак, самые широкие возможности адресации имеются в защищенном 32-разрядном режиме, наиболее естественном для современных процессоров. В этом режиме может использоваться как плоская, так и сегментная модели памяти. Под плоской (flat) понимается модель, в которой все сегментные регистры указывают на один и тот же сегмент памяти (как правило, начинающийся с нулевого адреса), и его лимит может достигать 4 Гбайт, что позволяет адресовать этот немалый (даже по нынешним меркам) объем памяти без манипуляций сегментными регистрами. Однако при этом теряются все возможности виртуализации памяти на основе сегментов, а также отсутствует сегментная защита. В сегментной модели памяти сегментные регистры кода, стека и данных настраиваются на разные, возможно и не пересекающиеся сегменты. Здесь имеются все возможности сегментной защиты и сегментной виртуализации памяти. Поскольку современным приложениям пока достаточно 4 Гбайт памяти (надолго ли?), сегментную модель ради упрощения диспетчера памяти стараются не использовать. Защита памяти имеется и на уровне страниц, правда, не такая развитая и надежная, как сегментная.

12.5.2. Проблемы страничной переадресации

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

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