Pages

Friday, June 12, 2009

Адресное пространство Windows CE 3.0 - 5.0, Windows Mobile 5.0, 6.0, 6.1

Windows CE - это 32-битная операционная система. Максимальное 32-битное число определяет максимально допустимый адрес – это 4GB. Адресное пространсво между 2GB и 4GB зарезервировано для самой системы.



Адрессное пространство между 0 и 1GB + 32MB разделено на 33 различных секции. Такие секции называют «слотом процесса». Самый нижний слот обозначают 0, а самый верхний имеет номер 32. Слот 0 используется для активного процесса.

Каждый процесс на Windows CE получает свои 32MB адресного пространства, которое используется для загрузки DLL файлов, стеков, кучи и других операций по выделению памяти.

В нулевом 32 мегабайтовом блоке памяти, начиная с адреса 0x02000000, располагаются специальные DLL файлы – так называемых eXecute In Place (XIP) – выполнить на месте, без предварительной загрузки в память. Эти DLL файлы являются частью ROM (ROM-based DLL).

Если процесс загружает какие-то другие DLL, то они грузятся вслед за системными (ROM-based) DLL – если представлять 32MB процеса так, что больший адрес находится сверху, то системные DLL будут в самом верху, а потом расположаться остальные DLL загруженные процессом.

Дальше, ниже DLL, следует свободное пространство, которое занимает куча памяти процеса (или кучи), затем идет стек (или стеки). В самом низу 32MB находится EXE – исполняемый модуль. Его адрес – это 0x00010000 – 64KB. Ниже этих 64KB – пространство зарезервированое системой.

Относительное сложные приложения, в процесе работы, выделяя и освобождая память, «перемешивают» области памяти и порядок, когда стек следует куче памяти, нарушается. «Смешивание» затрагивает и область с DLL.

Система, когда увеличивает размер кучи памяти, вызывает VirtualAlloc с первым параметром равным NULL. Windows CE может взять недостающую память и из области загрузки ROM DLL файлов - только тех, которые на момент сборки системы заданы как загружаемые и выгружаемые.

Когда система создает поток (thread), то для создания стека для потока, также вызывается функция VirtualAlloc и, также, память может выделяться и из области системных DLL.

Слот 0 – активный процес – это «клон» текущего процеса – если приложение из слота 12 активно, то 12 слот клонируется в слот 0.
Если какой-то процесс загружает DLL, то адресс загрузки должен быть свободен для всех процесов системы.

No comments:

Post a Comment