Куда исчезает память в клиентских версиях Windows x86
Здравствуйте уважаемые читатели блога www.ithabits.ru. Продолжаем наше увлекательное исследование особенностей работы 32-битных операционных систем с оперативной памятью большого объема.
В прошлый раз мы уже полностью переключились на системы от Microsoft и выяснили, что все пользовательские версии x86, начиная с Windows XP SP2, не могут использовать физическую память больше 4-гигабайт из-за установленного в ядре ограничения. Мы нашли объяснение Microsoft, что это ограничение было сделано для того, чтобы избежать неустойчивой работы драйверов устройств, написанных без поддержки режима PAE (Physical Address Extension).
Остановились мы на том, что ограничение 4 гигабайта оперативной памяти не только делает невозможным использование физической памяти большего объема, но и, как мы скоро увидим, приводит к проблемам и в этом диапазоне.
Перейдем от теории к практике и на реальном примере покажем, почему в самом начале мы определили границу «большой памяти» для 32-разрядных операционных систем на уровне около 3, а не 4 ГБ.
Поможет нам в этом ноутбук Acer с 4 ГБ оперативной памяти и 32-битной Windows 7 Professional.
Сколько физической памяти компьютера доступно 32-разрядной операционной системе Windows 7
Посмотрим, сколько памяти видит windows 7, и что говорит об использовании физической памяти в этом компьютере сама операционная система >
Вот это да! Если верить тому, что мы видим, а не верить, вроде, оснований пока нет, то получается, что 1,51 ГБ – “деньги на ветер”.
Как же так? А все очень просто.
Адресное пространство под нужды оборудованияПосмотрим еще несколько отчетов. Запустим “Диспетчер задач”, затем “Монитор ресурсов” и откроем вкладку “Память” >
Ну вот, собственно, и готовый ответ на вопрос об использовании физической памяти — сколько памяти видит windows 7, или куда исчезли полтора гигабайта физической памяти. Они зарезервированы под нужды оборудования.
Нет, не так. Под нужды оборудования зарезервирована не память, а 1,5 ГБ адресного пространства в интервале 4 ГБ. Так как одно и тоже адресное пространство не может быть одновременно использовано и устройствами и памятью компьютера из-за неизбежного конфликта, “лишней” физической памяти стало просто некуда деться и она оказалась недоступна.
На первый взгляд такое положение вещей не кажется правильным и, естественно, не вызывает радости. Однако, как показала история развития компьютерной техники, решение разместить порты ввода-вывода устройств в основном адресном пространстве процессора было исключительно верным. Это позволило многократно увеличить скорость обмена данными с устройствами и разгрузить центральный процессор. Можно даже предположить, что без такого архитектурного решения, например, вряд ли была бы возможна современная высокопроизводительная графика.
Обратимся еще раз к таблице характеристик процессоров, приведенной в первой публикации. Первым процессором, который имел возможность адресовать 4 гигабайта оперативной памяти, был Intel 80386 выпущенный в 1985 году. Когда разрабатывался компьютер на его основе, было принято решение выделить адреса портов ввода-вывода устройств в верхней части 4-гигабайтного адресного пространства, а нижнюю часть отдать под физическую память.
Как мы уже говорили, представить себе в то время клиентский компьютер с 4 гигабайтами оперативной памяти было крайне сложно. И действительно, долгие годы адреса устройств и максимальный адрес установленной физической памяти шли на встречу друг другу, но не пересекались, и никаких конфликтов не возникало. Выглядело это примерно так >
Конфликт адресов физической памяти и устройствНекоторое время назад реально появились клиентские компьютеры с 3 — 4 гигабайтами оперативной памяти (сейчас то этим уже никого не удивишь) и адреса оперативной памяти и устройств “встретились” и пересеклись. Вот так условно можно представить картину распределения адресного пространства и использования физической памяти для компьютера с установленными 4 гигабайтами оперативной памяти>
Красная зона в адресном пространстве, занятом устройствами, отражает конфликт, который всегда решается не в пользу физической памяти – это реальные потери, те самые 1,5 ГБ для нашего ноутбука.
Величина “потерь” зависит от того, как много физической памяти установлено в компьютере, и какое адресное пространство резервируют под себя устройства. На разных компьютерах она будет различной. Например, на моем настольном компьютере под нужды оборудования резервируется в два раза меньше — около 0,75 ГБ, но так как физической памяти установлено 6 ГБ, то потери в 32-битной Windows составят уже примерно 2, 7 ГБ, то есть почти половину (!)
Частично воспользуемся методикой, описанной в классической статье Марка Руссиновича «Pushing the Limits of Windows: Physical Memory«, и сделаем две вещи, — они нам пригодятся впоследствии. Воспользуемся маленькой диагностической утилитой MemInfo от Alexa Ionescu. Запустим ее с правами администратора на нашем ноутбуке с ключом –r и посмотрим как используется физическая память >
А теперь откроем “Диспетчер устройств” в “Управление компьютером”. Переключим “Вид” на “Ресурсы по типу” и откроем блок “Память” >
Сравниваем верхнюю границу физической памяти “9F800000”, определенную утилитой MemInfo, с нижней границей диапазона адресов, зарезервированных устройствами. В нашем случае это “A0000000” для видеокарты AMD Radeon HD. Все сходится. Есть еще окно в нижней части в диапазоне 640 КБ – 1 МБ. Как не трудно догадаться, это атавизм, пришедший к нам от 16-разрядного процессора 8086 и ДОС.
Вот так обстоят дела в “классических” 32-разрядных системах. В нашем случае система не является “классической” из-за включенного режима PAE, но выглядит абсолютно так же благодаря Microsoft-овскому ограничению. Очевидно, что задействовать в таких системах полностью 4 ГБ оперативной памяти невозможно в принципе.
Microsoft, некоторым образом, вводит пользователей в заблуждение, декларируя поддержку 4 гигабайт оперативной памяти. На самом деле, как мы уже поняли, система не может задействовать всю память из-за того, что адресное пространство ограничено сверху “FFFFFFFF” (4 ГБ), а именно это и делает Microsoft не смотря на то, что процессор может адресовать несоизмеримо больше и сама ОС давно поддерживает PAE. Одну из наиболее вероятных причин по которой это было сделано мы рассмотрели в прошлый раз.
Как полностью задействовать 4 гигабайта физической памяти в Windows x86По-хорошему, для того, чтобы продемонстрировать, как можно вернуть “потерянную” память, нужно установить на нашем ноутбуке Linux с ядром PAE или серверную 32-разрядную версию Windows, причем такую, для которой заявлена поддержка более 4 ГБ памяти. Это, например, Windows Server 2003 или 2008 в редакции Enterprise. Делать мне ни первого, ни второго, по правде говоря, совершенно не хочется.
Марк Руссинович использовал для аналогичных целей 64-разрядную ОС. Мы пойдем другим путем. Для этого, правда, придется поступить не совсем честно по отношению к Microsoft — мы просто снимем в ядре ограничение на 4 гигабайта оперативной памяти. Как это сделать можно прочитать здесь.
Делаем и смотрим, что получилось >
Как видим, “потерянная” память сразу нашлась. Еще раз откроем монитор ресурсов >
Тут Windows пытается ввести нас в заблуждение когда говорит, что теперь под оборудование зарезервировано всего 138 Мбайт. Я не буду еще раз показывать карту распределения памяти устройств из “Диспетчер устройств” в силу того, что ровным счетом ничего не изменилось – все устройства остались на своих местах в диапазоне адресов между “A0000000” и “FFFFFFFF”. То есть, на самом деле серым цветом монитор ресурсов показывает не размер адресного пространства, зарезервированного под нужды устройств, а суммарный объем “потерянной” памяти. Почему “суммарный” станет ясно, когда мы перейдем к компьютеру с объемом установленной физической памяти больше 4 ГБ.
Посмотрим диапазоны зарегистрированной физической памяти с помощью утилиты MemInfo >
Видим, что внизу добавился новый диапазон размером 1,4 ГБ. Это и есть наша “потерянная” память. Из-за того, что мы продолжаем оперировать 32-х разрядными адресами, получился, как бы, конфликт. На самом деле никакого конфликта нет в силу того, что добавившийся диапазон физических адресов лежит выше “FFFFFFFF”. Попробуем графически изобразить то, что получилось после того, как мы сняли 4-гигабайтное ограничение >
“Умный” чипсет и BIOS ноутбука перенесли конфликтную часть физической памяти выше 4 Гбайтной границы. Благодаря этому и работающему режиму PAE, этот участок физической памяти стал доступен операционной системе.
Тут не лишним будет отметить, что для того, чтобы “потерянная” память могла вернуться, нужен не только процессор с поддержкой PAE, но и материнская плата, которая, во-первых, поддерживает больше 4 ГБ ОЗУ, во-вторых, умеет перемещать адресные блоки физической памяти, конфликтующие с оборудованием, выше “FFFFFFFF”. В BIOS по поводу последнего даже может быть отдельная настройка, что-то типа “Memory Remapping”. В использованном мной ноутбуке я такой настройки не нашел – видимо выбор Enabled/Disabled происходит в нем автоматически.
Подводим промежуточные итоги:
32-битные клиентские операционные системы Microsoft могут работать со всей установленной в системе физической памятью. В том, что это действительно так, мы убедимся в заключительной публикации на эту тему на примере компьютера с 6 ГБ оперативной памяти.