Показать сообщение отдельно
Старый 01.11.2012, 17:50   #2270
Карполя
Техподдержка
Медаль пользователю. ЗОЛОТОМедаль автору. ЗОЛОТО Форумчанин
Аватар для Карполя
Регистрация: 25.01.2008
Адрес: Санкт-Петербург
Сообщения: 1,314
Репутация: 298
Ну, а как, по-вашему, передать в материнку адрес ячейки памяти с номером свыше 4294967295 по 32-разрядной шине? Тут никакая "светлая голова" не поможет.

В DOS было проще: и материнка с процессором, и ОС фактически поддерживали 4 МБ памяти (адресная шина позволяла), ограничивал только БИОС. Поэтому была возможность расширить пределы адресации с помощью дополнительных драйверов emm386.exe и himem.sys.

В 32-разрядных ОС уже обеспечена полная поддержка физических возможностей адресации всех 4 ГБ.

Другое дело - ограничение в доступных 3-3,5 Гб. Это связано с тем, что драйвера устройств работают на физическом уровне, с прямой адресацией, и занятые ими адреса отдавать для работы программ категорически не хотят. И программным путем это не обйти (разве что, использовать "дыры" - свободные области между адресами, занятыми устройствами, но эти "дыры" маленькие, сильно дефрагментированы и их использовать нерационально - пойдут тормоза при переадресации).

Как вывод: аналог emm386.exe и himem.sys в Винде есть, и он называется режимом PAE (Physical Address Extension). До версии Windows XP sp1 он был по умолчанию выключен, а при включении можно было получить доступ ко всем 4 ГБ (а не к 3 с копейками). Однако при этом при обращении к адресам свыше 3 ГБ могли быть конфликты с драйверами устройств, которые не желали отдавать свои адреса оперативке.

С версии Windows XP sp2 и выше, вплоть до Windows 7 и 8 PAE по умолчанию включен, но в урезанном виде - доступна память до самого нижнего адреса, используемого драйверами. Это ограничение введено именно для того, чтобы конфликты не могли возникнуть в принципе.

А больше этого (свыше 4 ГБ) не сможет обеспечить никакая, даже самая умная ОС, если она 32-разрядная (без аппаратной поддержки со стороны материнской платы с аппаратным диспетчером памяти, устанавливаемом на серверных платформах, благодаря чему серверные ОС могут работать и с более 4 ГБ, если, конечно, есть аппаратная поддержка).

Что касается последнего резерва - использования дыр памяти между драйверами.

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

Так что Майкрософт на этот раз поступил правильно - не стал второй раз наступать на те же грабли и использовать "дыры", тем более, выигрыш составлял бы несколь сот мегабайт, а быстродействие и стабильность падали.

Так что обсуждать тут больше нечего - либо смиряемся с физическим пределом в 4 ГБ и фактичесим пределом в 3-3,5 ГБ, либо переходим на другую ОС - 64-битную либо (если материнка позволяет) на Windows Server (только учтите, если в материнке нет диспетчера памяти, то и Windows Server не спасет - будет видеть те же 3-3,5 ГБ)