
Часто случается так, что операционной системе доступно меньше памяти, чем физически установлено. Эта проблема с завидным постоянством преследует пользователей персональных платформ от первых компьютеров IBM PC до современных 64-битных систем.
Стремление к сокращению сроков и стоимости разработки заставляет системных архитекторов жить одним днем. Так рождаются механизмы адресации памяти, оптимизированные под требования сегодняшнего дня, но практически непригодные к масштабированию. В итоге, требование увеличения объема адресуемой памяти приводит к необходимости все переделывать. В конкурентной борьбе между истинными инженерными шедеврами и вещами, «заточенными» под несовершенный мир, обычно выигрывают вторые, типичными представителями которых являются архитектура x86 и платформа PC.
16-битные системы или как зародилась проблема
Процессор Intel 8088, на основе которого были построены первые IBM PC, используя механизм сегментации, генерировал 20-битный адрес. Таким образом, размер адресного пространства был равен 1 Мегабайт или (2 в степени 20) байт. Из них 640 Килобайт использовалось для оперативной памяти, остальные 384 Килобайта для адресации видео памяти, системного BIOS, модулей расширения BIOS и других ресурсов. Огромное количество программного обеспечения, написанного под операционную систему MS-DOS, использовало 20-битную адресацию. Поэтому не удивительно, что таким программам, при запуске на современных платформах, доступно только 640 Килобайт нижней памяти.
32-битные системы или как повторилась проблема
32-битные процессоры, эра которых началась с Intel 80386, способны адресовать 4 Гигабайта или (2 в степени 32) байт памяти. Как и в случае IBM PC, в адресном пространстве персональной платформы должна быть размещена не только оперативная память, но и ряд других ресурсов, суммарный размер которых, в зависимости от конфигурации может составлять 128-768 Мегабайт. Список этих ресурсов можно увидеть, воспользовавшись, например, диспетчером устройств Microsoft Windows. Именно поэтому, установив 4 Гигабайта и более оперативной памяти, мы увидим, что операционной системе доступно около 3.2 – 3.8 Гигабайт.
64-битные системы и как их оптимизировать
Рассмотрим современную платформу (например Asrock Z77, описанную на сайте upweek.ru), на которой 64-битный процессор теоретически способен обслуживать адресное пространство размером (два в степени 64) байт. Это гигантский размер, поэтому систем, адресующих такое количество памяти, не существует. Реальная разрядность физического адреса зависит от модели процессора. Например, для большинства процессоров Intel это 36 бит, что теоретически позволяет адресовать (2 в степени 36) байт или 64 Гигабайта памяти.
Для того, чтобы теория стала практикой, требуется поддержка и со стороны системной логики. В модельном ряду чипсетов Intel для персональных платформ такая поддержка впервые появилась в серии 955.
Северный мост Intel 82955X принимает от процессора 36-битный адрес и обеспечивает адресное пространство 64 Гигабайт. Максимальный объем оперативной памяти для данного чипсета – только 8 Гигабайт, это обусловлено архитектурой контроллера памяти. Это еще не все. Требуется 64-битная операционная система. Для 32-битной ОС, память, расположенная выше отметки 4 Гигабайта будет недоступна.
Существуют технологии, позволяющие 32-битному процессору получить доступ к памяти размером более 4 GB. Одна из таких технологий – PAE или Physical Address Extension. Но данный аспект не является предметом нашего рассмотрения.
Итак, сформулируем алгоритм. Обнаружив несоответствие в размерах установленной и доступной памяти, полезно получить ответы на следующие вопросы:
- Является ли процессор 64-битным?
- Поддерживает ли чипсет разрядность адреса более 32 бит.
- Является ли операционная система 64-битной?
- Включена ли опция Memory Relocation (или Memory Remap) в настройках BIOS Setup?
Практикум для хакеров
Следуя традиции нашей тестовой лаборатории, изучим вопрос на уровне анализа содержимого регистров чипсета. Эксперименты будем проводить с платформой Gigabyte GA-965GM-S2, на которую установлено 4GB оперативной памяти. Нам потребуется документ: Intel 965 Express Chipset Family Datasheet. July 2006. DN: 313053-002.
К рассматриваемому вопросу имеют отношения два регистра, входящие в состав северного моста системной логики:
TOLUD (Top Of Low Usable DRAM), определяет верхнюю границу оперативной памяти, расположенной в пределах нижних четырех гигабайт адресного пространства. См. пункт 5.1.34 документа.
TOUUD (Top Of Upper Usable DRAM), определяет верхнюю границу оперативной памяти, расположенной выше отметки 4GB. См. пункт 5.1.31 документа.
В нашей тестовой лаборатории была написана небольшая утилита, запускаемая из MS-DOS и визуализирующая карту памяти на основании содержимого регистров чипсета.
Рис 1. Скрин-шот дампа памяти в пределах 32-х битной адресации
Как видим, на данной платформе, 4GB оперативной памяти размещены в адресном пространстве в виде трех диапазонов. Специальные области памяти (Shadow и SMRAM) сейчас не являются предметом нашего рассмотрения.
- Conventional RAM (диапазон от 0 до 638KB) - память, доступная для программ MS-DOS.
- Extended RAM (диапазон от 1MB до 3.2GB) - память, доступная для 32-битных операционных систем. Верхняя граница этого диапазона зависит от содержимого регистра TOLUD.
- Extended RAM >4GB (диапазон от 4GB до 4GB+768MB) - память, доступная только для 64-битных операционных систем. Верхняя граница этого диапазона зависит от содержимого регистра TOUUD.
Рис 2. Скрин-шот дампа памяти за пределами 4 GB пространства
Посмотрим на дамп памяти, расположенной выше отметки 4GB. Это содержимое сразу после загрузки MS-DOS. Интересно, что вопреки традиции, BIOS, не обнулил содержимое данной памяти. Возможно, это связано со законным стремлением разработчиков платформы сократить время выполнения POST-процедуры