В поисках пропавшей памяти

27 Июн 2013

В поисках пропавшей памяти

Часто случается так, что операционной системе доступно меньше памяти, чем физически установлено. Эта проблема с завидным постоянством пре­сле­ду­ет пользователей пер­со­наль­ных платформ от первых компьютеров 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, описанную на сайте http://www.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. Но данный аспект не является предметом нашего рассмотрения.

Итак, сформулируем алгоритм. Обнаружив несоответствие в размерах установленной и доступной памяти, полезно получить ответы на следующие вопросы:

  1. Является ли процессор 64-битным?
  2. Поддерживает ли чипсет разрядность адреса более 32 бит.
  3. Является ли операционная система 64-битной?
  4. Включена ли опция 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 и визуализирующая карту памяти на основании содержимого регистров чипсета.

Дамп памяти в пределах 32-х битной адресации
Рис 1. Скрин-шот дампа памяти в пределах 32-х битной адресации

Как видим, на данной платформе, 4GB оперативной памяти размещены в адресном пространстве в виде трех диапазонов. Специальные области памяти (Shadow и SMRAM) сейчас не являются предметом нашего рассмотрения.

  1. Conventional RAM (диапазон от 0 до 638KB) - память, доступная для программ MS-DOS.
  2. Extended RAM (диапазон от 1MB до 3.2GB) - память, доступная для 32-битных операционных систем. Верхняя граница этого диапазона зависит от содержимого регистра TOLUD.
  3. Extended RAM >4GB (диапазон от 4GB до 4GB+768MB) - память, доступная только для 64-битных операционных систем. Верхняя граница этого диапазона зависит от содержимого регистра TOUUD.

Дамп памяти за пределами 4 GB пространства
Рис 2. Скрин-шот дампа памяти за пределами 4 GB пространства

Посмотрим на дамп памяти, расположенной выше отметки 4GB. Это содержимое сразу после загрузки MS-DOS. Интересно, что вопреки традиции, BIOS, не обнулил содержимое данной памяти. Возможно, это связано со за­кон­ным стрем­ле­ни­ем разработчиков платформы сократить время выполнения  POST-процедуры