В MSDN есть две интересные статьи посвященные управлению памятью на Windows CE 6.0:
1. Windows Embedded CE 6.0 Advanced Memory Management.
2. Virtual Memory Layout: Windows CE 5.0 vs. Windows Embedded CE 6.0.
Я попробую перечислить наиболее важные для меня моменты.
1. Windows CE 6.0 32-битная операционная система и поэтому позволяет адресовать 4GB памяти. То есть все виртуальное пространство это 4 гигабайта. Эти 4 гигабайта делятся пополам – адресное пространство ядра системы и адрессное пространтсво приложений пользователя – Kernel virtual address space and Application’s virtual address space.
2. В Windows CE 6.0 каждый запущенный процесс имеет свое виртуальное пространство - 2 гигайбата для пользовательских приложений, а не все 4. В этом отличие от Windows CE 5.x, где каждый процесс, якобы, имел «своих персональных» есть только 32 мегабайта. Это какое-то «скользкое место» во всех статьях о памяти – и Windows CE 5.x можно получить память из 1 гигабайта из Global Memory Area а «наломать дров» так и во всех 2 гигабайтах можно.
3. Виртуальное адрессное простанство для пользовательских програм можно разделить на 5 частей:
1) Нижний 1 гигабайт предназначен для загрузки самой программы и для всех алокаций памяти этой программой включася стэк для всех потоков. Адреса этого блока памяти от 0000 0000 до 4000 0000. Програмный код загруэается снизу, почти от 0000 0000 (небольшое пространство от самого 0 зарезервировано).
2) Следующий блок имеет размер 512 мегабайт с адресами от 4000 0000 до 6000 0000. Сюда система загружает пользовательские библиотеки (DLL) всех работающих в данный момент приложений. Также как и в предыдущих версиях Windows CE, в 6 версии каждая DLL при загрузке каким-то одним процессом получает адрес уникальный для всех процессов. Эти DLL загружаются снизу вверх начиная с адреса 4000 0000. В предыдущих версиях библиотеки загружались сверху вниз и «перемешивались» с алоцированной памятью и стеками в совсем ранних версиях (а в версия 5.2 «отхватили кусок» в глобальном участке памяти – Global Memory Area).
3) Начиная с адресса 6000 0000 располагается 256 мегабайтовый блок для так называемых объектов отраженных в память (memory-mapped objects, RAM-backed memory-mapped files). Это объекты, который используются для меэпроцессорных коммуникаций. Это, как бы, memory-mapped file, с одной стороны, но самого такого файла «физически» не существует. Для совместимости с предыдущими версиями, если какой-то процесс создал именованый объект, этот объект получит адресс одинаковый для всех процессов. Если эе процесс открывает реальный файл и мапирует его, то адрес будет в нижнем гигабайте. То есть этот малополезный для меня блок расположен между адресами 6000 0000 и 7000 0000.
4) Виртуальные адреса с 7000 0000 на 255 мегабайт, используется для коммуникации между операционной системой и програмой. Этот блок памяти для программы доступен только для чтения и только операционная система может писать в эту память.
5) Самый верхний мегабайт с адресса 7FE0 0000 не доступен для программы или операционной системы – это защитный буфер.
В статьях есть много интересного, я пока запомнил то, что написал.
No comments:
Post a Comment