Секреты ограничения памяти 32-х версий Windows

Максимальный размер оперативной памяти, который поддерживают 32-разрядные системы

Зададимся вопросом: могут ли 32-разрядные системы работать с физической памятью больше 4 ГБ в принципе и если да, то каким образом.

Главное, что надо сделать в самом начале, это четко разделить между собой три понятия:

Свойства процессора;
32-битная операционная система;
32-разрядное приложение (программа)
Последние два очень часто смешивают в одну кучу, чего в данном случае, делать как раз не следует. Начнем по порядку и издалека – совершим короткий исторический экскурс.

Обратимся к таблице основных характеристик популярных процессоров от Intel:

Эта таблица нужна нам для того, чтобы наглядно показать тот факт, что разрядность адресной шины отнюдь не всегда совпадала с разрядностью архитектуры процессора.
Для начала обратим внимание на 16-разрядные процессоры. Если бы они имели 16-разрядную адресную шину, то максимальный размер доступной им физической памяти составлял бы всего 64 КБ (2 в 16-й степени равно 65536). Однако уже Intel 8086 мог работать с памятью до 1 МБ, а 80286 уже до 16 МБ благодаря 20 и, соответственно, 24 битам шины адреса.
Эпоха процессоров x86 совместимых процессоров с 32-х разряздными регистрами и 4 ГБ ОЗУ началась с Intel 80386 в далеком 1985 году. На протяжении последующих 10 лет 32-х разрядный процессоры архитектуры х86 не имели физической возможности работать с памятью более 4 ГБ.
В 1995 году был представлен процессор Intel Pentium Pro. Наряду с совершенно новой архитектурой ядра этот процессор получил 36-битную адресную шину благодаря чему, как не трудно подсчитать, максимальный размер доступной ему физической памяти увеличился до 64 ГБ (в современных 64-разрядных процессорах используются 37 разрядов, что увеличивает предел адресуемой физической памяти до 128 ГБ).
Кроме того, в процессоре был реализован «хитрый» механизм управления памятью, который отображал физическую память, расположенную за пределами 4 ГБ, в 32-разрядную виртуальную память в диапазоне 0 — 4 ГБ «обманывая» таким образом 32-разрядные приложения. Такой режим управления памятью процессором х86 получил название PAE (Physical Address Extension — расширение физических адресов).
Pentium Pro позиционировался в то время как процессор для серверов и рабочих станций. Действительно, представить себе в 1995 году настольный компьютер с объемом оперативной памяти не то что больше, а хотя бы отдаленно приближающимся к 4 ГБ, было не просто. Память измерялась тогда мегабайтами. К примеру, в 1998 году размер ОЗУ обычного настольного компьютера в 32МБ не считался маленьким. А стоила такая планка памяти от 60$. И в наше то время (2014 год) полным ходом используются компьютеры менее чем с 4 ГБ памяти. Для работы офисных приложений в связке с Windows XP такого объема памяти даже много. Кроме того, процессор Pentium Pro был очень дорогим и имел проблемы с быстродействием при выполнении популярных в то время 16-разрядных приложений.
Можно сказать, что такое решение было новым для 32-разрядных процессоров, однако, в силу того, что ранее подобная практика повсеместно применялась в 16-разрядных процессорах, революционной ее назвать сложно. Ведь еще со времен DOS широко применялся трюк с сегментной адресацией когда вся память была разбита на сегменты в 64КБ и адрес состоял из двух частей: сегмента и смещения внутри сегмента, таким образом удавалось использовать более 64КБ памяти.
Не все, но подавляющее большинство современных процессоров х86 для настольных компьютеров являются 64-разрядными и имеют поддержку PAE. Благодаря этому они не только могут работать с памятью более 4 ГБ, но и предоставляют такую возможность 32-битным операционным системам.

Проще всего определить поддержку режима PAE процессором оказалось в Linux. В Ubuntu, или в любом из ее многочисленных клонов, можно набрать в терминале:
grep —color=always -i PAE /proc/cpuinfo
В результате должно получиться что-то вроде этого:

32-разрядные операционные системы

Первой в ряду 32-разрядных ОС Microsoft стала Windows NT 3.1, выпущенная в 1993 году. Она предназначалась для корпоративного сектора, то есть для серверов и рабочих станций. Двумя годами позже в 1995 году появилась Windows 95 — операционная система для настольных компьютеров и ноутбуков. Между двумя этими событиями в 1994 году была представлена версия 1.0 ядра Linux. 32-разрядная архитектура оказалась столь удачной и «достаточной», что она повсеместно используется до сих пор на протяжении вот уже 2-х десятилетий. Последней 32-битной серверной операционной системой Microsoft стала Windows Server 2008. Однако, новейшая Windows 8 по-прежнему предлагается в двух вариантах. Для реализации дополнительных возможностей режима расширения физических адресов, помимо наличия соответствующего процессора и материнской платы с адекватным чипсетом и нужным количеством разведенных адресных линий, необходима поддержка PAE непосредственно самой операционной системой.
Если у Вас 32-разрядный Linux, то проблем с использованием памяти объемом более 4 ГБ, скорее всего, не возникнет. В операционных системах Linux поддержка PAE появилась в 1999 году в ядре 2.3.23 и используется с тех пор безо всяких ограничений.

Посмотрим таблицу максимально поддерживаемых размеров физической памяти, взятую из статьи 2005 года в msdn.microsoft.com, для Windows 2000, Windows XP и Windows Server 2003 >

Как видно из этой таблицы, режим PAE поддерживается во всех версиях ОС Microsoft начиная с Windows 2000. Вариации размеров максимальной памяти в различных версиях серверных операционных систем объясняются исключительно их позиционированием на рынке компанией Microsoft. Наверное, так проще объяснить их отличающуюся друг от друга стоимость. Для нас особый интерес представляют строки таблицы, которые прямо говорит о том, что во всех версиях Windows XP общее адресное пространство физической памяти ограничено на уровне 4 ГБ. Именно искусственно ограничено в ядре, так как поддержка PAE есть.
Режим PAE может быть включен, может быть выключен. Начиная с Windows XP SP2 PAE включается принудительно для обеспечения работы технологии безопасности DEP (Data Execution Prevention — предотвращение выполнения данных).

DEP – это технология, которая позволяет защитить операционную систему от большого класса вредоносного кода, который изначально внедряется в область памяти, отведенную под данные и маскируется под данные, а затем пытается из нее запуститься. Технология DEP такое выполнение вредоносного кода блокирует. Реализуется технология как программно, так и аппаратно. В последнем случае процессор помечает отдельные страницы памяти как не содержащие исполняемого кода измененным старшим битом в адресной таблице PTE (Page Table Entry) виртуальной памяти, а затем перехватывает и предотвращает запуск исполняемого кода с этих страниц.

32-разрядные приложения
Благодаря диспетчеру памяти процессора, осуществляющему ее распределение в режиме PAE независимо от работы приложений, и поддержке такого режима работы операционной системой, 32-разрядные приложения отделены от физической памяти и не имеют сведений о ее реальном размере. Каждому приложению, так как для них сохраняется 32-битное адресное пространство, по-прежнему доступны только 4 ГБ виртуальной памяти. В Windows под нужды самого приложения из этих 4 ГБ отдается ровно половина, в Linuх — 3 ГБ. В Windows существует возможность принудительно отдать приложению 3 ГБ, но, в большинстве случаев, это является нецелесообразным.
Необходимо иметь в виду, что включение режима PAE отнюдь не эквивалентно переходу на 64-битную систему, в которой каждому приложению выделяется несравнимо больший объем памяти. Если за счет PAE попытаться непосредственно удовлетворить непомерный аппетит некого современного приложения, например, пакета инженерного или графического моделирования, то ничего хорошего не получится. А вот если требуется одновременно запустить несколько требовательных к памяти (но не супертребовательных) приложений, то польза от PAE будет прямая. В первую очередь это касается серверов.
Например, требуется одновременная работа двух виртуальных машин, каждой из которых отведено по 2 ГБ памяти. Что будет без PAE понятно — вторая виртуальная машина, скорее всего, просто не запустится, ну или в системе начнется такой интенсивный обмен со swap-файлом, что процесс перейдет в категорию «пошаговая стратегия». С включенным PAE, при условии достаточного объема физического ОЗУ хостовой машины, обе виртуальные машины смогут благополучно работать.
К недостаткам PAE обычно относят возможное снижение производительности системы из-за уменьшения скорости доступа к памяти, связанной с дополнительными операциями на переключение отображаемых страниц памяти, и плохую работу некоторых драйверов устройств в 36-битном адресном пространстве.

Максимально поддерживаемые различными версиями Windows объемы физической памяти

Посмотрим сколько оперативной памяти поддерживают другие версии Windows, выпущенных после ХР.

В версиях Windows Vista х86 по сравнению с ХР практически ничего не изменилось.

Как видим, опять никаких изменений – абсолютный предел для x86 остался на уровне 4 ГБ. 1 ГБ в Windows Vista Starter и 2 ГБ в Windows 7 Starter только подкрепляют вывод об искусственном характере этих ограничений.

То же для Windows 8

Как видно из представленной таблицы, в плане лимитов памяти в Windows 8 тоже ничего не изменилось. Жаль, могли бы уже, наверное, ограничение снять или, по крайней мере, отодвинуть.

И тут самое время рассмотреть причины, по которым Microsoft ограничивает верхний предел доступной физической памяти в клиентских версиях Windows x86.

Одна из главных причин - Проблемы с безопасностью Windows XP.

Windows XP была выпущена осенью 2001 года и за очень короткий срок завоевала огромную популярность среди пользователей во всем мире. А, как известно, где большая популярность, там и большие проблемы. Моментально для нее было создано огромное количество вредоносного кода в виде разнообразных и многочисленных вирусов. При этом оказалось, что новая операционная система имеет ряд уязвимостей и весьма низкую стойкость ко взлому. Своего полноценного клиентского антивирусного пакета в то время у Microsoft не было. Ситуацию в значительной мере исправляли программные продукты сторонних разработчиков, однако, этого было явно недостаточно и, в целом, положение оставалось весьма напряженным.
Для того чтобы как-то повысить безопасность Windows XP, в 2004 году был выпущен второй пакет обновлений — SP2. И тут возникли проблемы. Одной из главных особенностей этого пакета, с точки зрения безопасности, было включение технологии DEP (Data Execution Prevention — предотвращение выполнения данных). Эта технология, повсеместно используемая и сегодня, позволяет отражать целый класс вредоносных атак благодаря запрету запуска исполняемого кода с непредусмотренных для этого страниц памяти. Но для работы DEP должна быть включена поддержка PAE (Physical Address Extension — расширение физических адресов). Включение режима PAE меняет механизм обращения к страницам оперативной памяти и делает возможным работу с физической памятью размером более 4 ГБ. Однако при подготовке и тестировании Windows XP со вторым пакетом обновлений обнаружились большие проблемы, приводившие к фатальным ошибкам и аварийным отказам в работе операционной системы. Очень быстро причины неприятностей были найдены. Ими оказались драйверы устройств, написанные без учета возможности их работы в режиме PAE.

Небольшое отступление.
В режиме PAE любая страница памяти 32-разрядного виртуального адресного пространства приложений на самом деле может быть расположена в любом месте доступной физической памяти. Обычные приложения это обстоятельство никак не затрагивает, им все равно. А вот для драйверов устройств все значительно хуже – им то надо работать с конкретными физическими адресами, а не с виртуальными. Условно ситуацию можно представить так:

Драйвер пытается считать или записать некую информацию по адресам, которые отведены для работы с устройством. Если драйвер “глупый”, не понимает в каком окружении он работает и не может “договориться” с операционной системой, то, как показано на рисунке, вместо портов ввода/вывода своего устройства он начнет общаться с некими ячейками физической памяти. Результат такого “общения” для работы системы непредсказуем, вплоть до полного "зависания" и перезагрузки.

Для того чтобы решить эту проблему и не блокировать установку SP2 пользователями из-за возможных проблем, Microsoft приняла командирское решение — PAE включить, но тривиально ограничить верхнюю границу доступной оперативной памяти клиентских версий своей операционной системы на уровне 4 ГБ. Адреса при этом транслируются один в один как в “классической” 32-разрядной системе и “глупые” недоделанные драйверы устройств успешно работают.
Ну что же, дешево и сердито. Дешево потому, что производителям оборудования не нужно было спешно заказывать разработку “правильных” драйверов. Сердито потому, что отложенные таким образом до поры до времени проблемы с использованием физической памяти компьютера, были переложены на конечного пользователя.
Много уже гигабайт утекло с момента выхода SP2 для XP, а Windows по-прежнему не видит оперативную память больше 4 ГБ и, как мы видели по таблице “Physical Memory Limits: Windows 8”, изменений в этом плане не предвидится.
И это не совсем понятно: для Windows Vista все равно пришлось писать новые драйвера, значит была возможность переписать их корректно для работы с PAE, но ограничение в 4 ГБ так и осталось.
Сегодня уже очень трудно представить себе 32-разрядные драйверы, которые не умеют работать с памятью более 4 ГБ. Возможно причина в том, что Microsoft таким образом хочет подтолкнуть пользователей к переходу на x64?

А как же серверные версии Windows?
Можно предположить, что для них драйверы устройств сразу разрабатывались с учетом работы в режиме PAE, то есть были “умными” и тщательно тестировались. Этому способствовало и то обстоятельство, что в серверных конфигурациях оборудования не было такого “зверинца” встроенных устройств.
До недавнего времени, например, до появления технологии виртуализации рабочих мест, которая, в том числе, предполагает возможность обработки графики самим сервером, последнему совершенно не нужна была серьезная видеокарта, так как вполне хватало видео, встроенного в материнскую плату. Кроме того, 32-разрядные серверные версии Windows закончили свою историю на Windows Server 2008.

Во второй части секреты распределения памяти в 32-х разрядной Windows и как бороться с ограничением.

Продолжение. Часть 2

Источник www.ithabits.ru