![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYL7daRukEwQaQadlUbwkLd2UjuxG0iPoVJJ5ZWyF_ANICANpJwN2-kMBxA2e5qgXaZyYR6v5Igw_o4u-5U4zHqlmaA9e9RcGVldC2Nre-pI0xubGCuZ8My2quVsIVDD_7lLh3xHtJu3Y/s320/Windows+CE+memory.jpg)
Адрессное пространство между 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