HTC MAX 4G Rom Buildings

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » HTC MAX 4G Rom Buildings » Общая информация » Виртуальная Память в Windows Mobile 6.5


Виртуальная Память в Windows Mobile 6.5

Сообщений 1 страница 2 из 2

1

Виртуальная Память в Windows Mobile 6.5 и как она отличается от 6.1 и 6.0, важно, когда портируем на устройства, не имеющие Нативное ядро WM6.5 (как раз наш случай, "спасибо" Йота).

Вольный перевод для самого себя.

О Виртуальной Памяти на ru.wikipedia.org

Виртуальная Память, как это применимо к ядру Windows CE 5.2

Общее количество потенциально доступной памяти для WM при используемой 32 битной адресации - 4Гб. Это общее четырёх гигабайтное адресное пространство разбито на две половины - два гигабайта для ядра, два гигабайта для Пользователя. Адресное пространство ядра доступно исключительно для процессов/задач с уровнем доступа ядра, а пользовательское адресное пространство доступно для использования процессами/задачами с любым уровнем доступа.
Пользовательское адресное пространство расположено от 0x00000000 до 0x7FFFFFFF.
Адресное пространство ядра расположено от 0x80000000 до 0xFFFFFFFF.

Пользовательское адресное пространство разбито на 64 слота по 32Мб каждый. (64*32=2048, или 2Гб) - первые 33 слота (слот 0 и 1-32) используются под процессы, а остальные слоты для хранения объектов, отображённые файлы на память (Отображение файла на память) и ресурсы.

Каждый слот легко вертуализируется в HEX'е, вы просто увеличиваете число.
Слот 0: 0x00000000 в 0x01FFFFFF,
Слот 1: 0x02000000 в 0x03FFFFFF,
Слот 2: 0x04000000 в 0x05FFFFFF, ну и так далее.
Каждый процесс получает привязку к собственному слоту, всего их 33 в общем, минус процессы ядра, которые всегда запущены, поэтому Вы получаете ограничение в 32 процесса (которых на практике всегда меньше потому, что существуют постоянно запущенные процессы WM для поддержания OS) - это кстати является причиной ограничения в 32Мб для каждого процесса - как мы видим, это и есть адресное пространство, доступное для одного слота.

Как всё это сказывается на нашей ситуации с модулями? Когда Вы создаёте модуль, Вы задаёте WM, что хотите, чтобы этот модуль стал отображён на память (Отображение файла на память), следовательно, при каждой загрузке он будет загружаться в одну и ту же, известную часть памяти - сохраняя пространство в Слоте 0 - это делается на стороне компьютера, в процессе "кукинга" и это работа wmreloc, g'reloc, bepe Platrorm Rebuilder'а и т.д. Виртуальная разметка привязана к 64Кб бордюру, поэтому, если вы отображаете на память ДЛЛку (.dll) размером в 3Кб, она всё ещё поглощает пространство в 64Кб.

Существуют так же страницы, которые могут быть размещены в этих слотах, привязанных к 4Кб границе и процессуальным/главным привязкам, занимающим место при нормальных операциях. Способ, при котором система использует этот метод заключается в том, что модули размещены в процессе построения rom'а (модули, которые мы размещаем с помощью g'reloc'а и других) размещены сверху вниз (для слота 1 к примеру, начало в 0x03FFFFFF для первого модуля, занимает место до нижестоящей 64Кб границы, потом идет следующий модуль, на линию ниже к адресу 0x02000000, который является началом слота) - Главные расположения, которые используют место в процессе нормальных системных операций расположены в требующемся месте, снизу вверх (и вот снова со слотом 1 к примеру, начало в 0x02000000 и окончание в 0x03FFFFFF) - когда Вы заполняете эти слоты модулями всё больше и больше, они оставляют всё меньше и меньше места для Windows, чтобы динамически размещать другие, Главные размещения, которые могут стать и становятся результатом ошибок выпадания из памяти (даже, когда на устройстве остаётся ещё много свободной физической памяти, она не может быть адресована, т.к. виртуальная память уже заполнена).

Вот и пришло время для рассмотрения различий между 6.0/6.1/6.5 - существует всего 4 слота, которые могут быть использованы для модульного размещения, Слот 0, 1, 60 и 61. Слот 63 так же доступен для модулей, не содержащих кода (модули, содержащие исключительно ресурсы, наподобие .mui).

WinMo 6 должна размещать слот 0, 1 - (в порядке: 1 - первым, 0 - последним), для общих 64Мб пространства Виртуальной Памяти доступного для модулей/файлов (и запущенных процессов, всегда отображённых на Слот 0, поэтому, когда Вы впервые вторглись в это пространство памяти, Вы убрали доступную память для каждого запущенного приложения) - Вы можете увидеть, как это тяжело.

WinMo 6.1 улучшено в этом отношении открытием слотов 60 и 61 (теперь порядок размещения таков: 61, 60, 1, 0) - но модули не могут быть тут размещены. Только файлы. По этому, для наших перераспределительных инструментов это не несёт никаких коренных изменений. (Всё ещё  только слоты 1 и 0 для модулей) WM 6.1 так же представляет процесс initvmmap.exe в MSXIPKernel, NK partition (xip.bin). Этот процесс расчерчивает карту всей виртуальной памяти и использует следующий ключ реестра из загрузочной ветки (boot.hv):

Код:
[HKEY_LOCAL_MACHINE\System\Loader\ModuleInfo]
[HKEY_LOCAL_MACHINE\System\Loader\ModuleInfo\dllname.dll]
"filename.exe"=dword:1
"filename2.exe"=dword:1

Это сообщает системе, что модуль dllname.dll требуется только когда запускается filename.exe или filename2.exe, а когда эти процессы не запущены, место в виртуальной памяти доступно и может быть динамически использовано системой.

WinMo 6.5 улучшена в этом отношении открытием Слотов 60 и 61 для модулей - уступая дополнительные 64 мегабайта пространства доступной виртуальной памяти. (Порядок размещения теперь таков: 1, 61, 60, 0 - для модулей и 60, 61, 0 - для файлов) - чтобы ядро могло распознать, что эти новые Слоты были размечены для модулей, они должны быть обновлены до уровня базы кодов 6.5 Это как раз то, как 6.5 nk.exe используется и почему это так важно.

Профилирование Виртуальной Памяти - это важнейшая работа для OEM - наименьшая доступность к Слоту 0, из-за наибольшей вероятности, что устройство начнет выдавать ошибки выпадания из памяти (даже если реально выпадания из памяти не происходит) - это худший расклад, который может получить пользователь. Некоторые ROM'ы, которые я наблюдал, имели менее 20Мб в Слоту 0 (результат для пользователя был настолько ужасным, что представить сложно) - появлялось множество сложностей для цельных процессов - таких как балансирование загрузки между services.exe и device.exe для наибольшей пользы использования 32Мб Виртуальной Памяти, доступной каждому из этих процессов и размещение всех ресурсных ДЛЛок как модулей, доступных к размещению в Слот 63 и т.д.

Это дополнительно подчёркивается, как это важно, что перераспределяющие инструменты обновлены для поддержки новых слотов - g'reloc не будет даже пытаться размещать модули в Слоты 60 и 61 потому, что это опасно и даже невозможно. На данный момент мне известно два инструмента, которые будут перераспределять на слот 60 и 61 - wmreloc 2.0 и bepe's Rebuilder (используется ervius vk).

Какие же "домашние задания" будут в отношении Виртуальной памяти?

Держите Слот 0 настолько свободным, насколько это вообще возможно. WM 6.5 NK даёт Вам возможность использовать больше модулей без занятия пространства Слота 0, даёт больше гибкости для использования модулей (которые быстрее загружаются).

Перевод ужасен, надо еще дорабатывать, т.к. понимание переведённого текста лично у меня на данный момент низкое =)

2

Виртуальная память

Из русскоязычной википедии.

Виртуальная память - это технология управления памятью ЭВМ, разработанная для многозадачных операционных систем. При использовании данной технологии для каждой программы используются независимые схемы адресации памяти, отображающиеся тем или иным способом на физические адреса в памяти ЭВМ. позволяет увеличивать эффективность использования памяти несколькими одновременно работающими программами, организовав множество независимым адресных пространств, и обеспечить защиту памяти между разными приложениями. Также позволяет программисту использовать больше памяти, чем установлено в компьютере, за счет откачки неиспользуемых страниц на вторичное хранилище (Свопинг).

При использовании виртуальной памяти упрощается программирование, так как программисту больше не нужно учитывать ограниченность памяти, или согласовывать использование памяти с другими приложениями. Для программы выглядит доступным и непрерывным все допустимое адресное пространство, вне зависимости от наличия в ЭВМ соответствующего объема ОЗУ.
Применение механизма виртуальной памяти позволяет:
1) упростить адресацию памяти клиентским программным обеспечением;
2) рационально управлять оперативной памятью компьютера (хранить в ней только активно используемые области памяти);
3) изолировать процессы друг от друга (процесс полагает, что монопольно владеет всей памятью).

В настоящее время эта технология имеет аппаратную поддержку на всех современных бытовых процессорах. В то же время во встраиваемых системах и в системах специального назначения, где требуется либо очень быстрая работа, либо есть ограничения на длительность отклика (системы реального времени) виртуальная память используется относительно редко. Также в таких системах реже встречается многозадачность и сложные иерархии памяти.

Страничная организация виртуальной памяти

В большинстве современных операционных систем виртуальная память организуется с помощью страничной адресации. Оперативная память делится на две страницы: области памяти фиксированной длины (например, 4096 байт), которые являются минимальной единицей выделяемой памяти (то есть даже запрос на 1 байт от приложения ведёт к выделению ему страницы памяти). процесс обращается к памяти с помощью адреса виртуальной памяти, который содержит в себе номер страницы и смещение внутри страницы. Процессор преобразует номер виртуальной страницы в адрес соответствующей ей физической страницы при помощи буфера ассоциативной трансляции. Если ему не удалось это сделать, то требуется обращение к таблице страниц (так называемый Page Walk), что может сделать либо сам процессор, либо операционная система (в зависимости от архитектуры). Если страница выгружена из оперативной памяти, то операционная система подкачивает страницу с жёсткого диска (свопинг). При запросе на выделение памяти операционная система может "сбросить" на жёсткий диск страницы, к которым давно не было обращений. Критические данные (например, код запущенных и работающих программ, код и память ядра системы) обычно находятся в оперативной памяти (исключения существуют, однако они не касаются тех частей, которые отвечают за обработку аппаратных прерываний, работу с таблицей страниц и использование файла подкачки).

Страничная память - способ организации виртуальной памяти, при котором единицей отображения виртуальных адресов на физические является регион постоянного размена (так называемая страница).

Поддержка такого режима присутствует в большинстве 32 битных и 64 битных процессоров. Такой режим является классическим для почти всех современных ОС, в том числе Windows и семейства UNIX. Широкое использование такого режима началось с процессора VAX и ОС VMS с конца 70х годов (по некоторым сведениями, первая реализация). В семействе x86 поддержка появилась с поколения 386, оно же первое 32 битное поколение.

Решаемые задачи:
1) поддержка изоляции процессов и защиты памяти путём создания своего собственного виртуального адресного пространства для каждого процесса
2) поддержка изоляции области ядра от кода пользовательского режима
3) поддержка памяти "только для чтения" и не исполняемой памяти
4) поддержка отгрузки давно не используемых страниц в область подкачки на диске (свопинг)
5) поддержка отображённых в память файлов, в том числе загрузочных модулей
6) поддержка разделяемой между процессами памяти, в том числе с копированием-по-записи для экономии физических страниц
7) поддержка системного вызова fork() в ОС семейства UNIX

Сегментная организация виртуальной памяти


Вы здесь » HTC MAX 4G Rom Buildings » Общая информация » Виртуальная Память в Windows Mobile 6.5