Опубликован: 24.04.2009 | Доступ: свободный | Студентов: 1180 / 358 | Оценка: 4.39 / 4.28 | Длительность: 18:45:00
Специальности: Программист
Лекция 6:

Архитектура встраиваемой ОС реального времени – CE 6.0

Архитектура памяти

В устройстве на основе CE память ROM используется для хранения всей операционной системы (ОС), а также приложений, которые поставляются вместе с ОС. Используется отображение виртуальной памяти для уменьшения фрагментации памяти и обеспечения защиты памяти.

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

Многие устройства не имеют жесткого диска, и это также требует больше энергии. Флэш-память имеет также ограниченное количество циклов записи, что делает ее плохим выбором для устройства файла подкачки.

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

В CE, когда инициализируется процесс, ОС отображает следующие DLL и компоненты памяти:

  • Некоторые выполняемые-на-месте (XIP) динамически подключаемые библиотеки (DLL)
  • Некоторые разделы чтения/записи других XIP DLL
  • Все не-XIP DLL
  • Стек
  • Куча
  • Раздел данных для каждого процесса

Библиотеки DLL и разделы чтения/записи ROM DLL загружаются, начиная с вершины адресного пространства. Библиотеки DLL управляются загрузчиком, который загружает все DLL по одному и тому же адресу для каждого процесса. Стек, куча, и исполняемый файл (.exe) создаются и отображаются с нижней части адресного пространства. Нижние 64 Кбайта памяти всегда остаются свободными.

Для CE 6.0 процесс ядра располагается в верхних 2 Гбайтах из 4 Гбайтов (32 бит) виртуального пространства памяти, а нижние 2 Гбайта являются уникальными для каждого процесса. Существует ограничение примерно в 32000 процессов, в связи с количеством указателей, которые можно создать. Практическое ограничение числа процессов определяется объемом имеющейся физической памяти.

Так как доступ к виртуальной памяти транслируется в аппаратный доступ через устройство управления памятью (MMU), то код виртуальной памяти зависит от ЦП.

Центральные процессоры ARM и x86 используют аппаратные таблицы страниц, так что содержимое виртуальной памяти доступно непосредственно оборудованию, в то время как другие ЦП используют программный буфер опережающей выборки при передачах (TLB) miss handler, где содержимое виртуальной памяти необходимо заполнить, чтобы TLB действовал.

Рисунок 6.5 показывает внутреннее отображение адресного пространства виртуальной памяти для процесса пользователя.

Отображение виртуальной памяти пространства пользователя

Рис. 6.5. Отображение виртуальной памяти пространства пользователя

Проектные задачи управления виртуальной памятью в CE 6.0 включают:

  • Большой объем виртуальной памяти на процесс
  • Отсутствие предварительно заданного ограничения на число процессов
  • Защита от влияния процессов друг на друга
  • Минимизация зависимого от ЦП кода
  • Эффективное распределение виртуальной памяти
  • Эффективная обработка пропущенных TLB
Отображение виртуальной памяти пространства ядра

Рис. 6.6. Отображение виртуальной памяти пространства ядра

Рисунок 6.6 показывает внутреннее отображение адресного пространства виртуальной памяти. Таблица 6.1 показывает карту виртуальной памяти CE 6.0, и описывает каждую область более подробно.

Таблица 6.1. Карта виртуальной памяти (ВП) CE 6.0
Режим Диапазон Размер Описание Комментарии
ядро 0xF0000000 - 0xFFFFFFFF 256 MB ВП специфическая для ЦП Область ловушки системных вызовов. Страница данных ядра.
ядро 0xE0000000 - 0xEFFFFFFF 256 MB ВП ядра, зависящая от ЦП Виртуальная память пространства ядра, если не запрещено ЦП, таким как SHx.
ядро 0xD0000000 - 0xDFFFFFFF 256 MB ВП ядра Виртуальная память пространства ядра, совместно используемая всеми серверами и драйверами, загруженными в ядре.
ядро 0xC8000000 - 0xCFFFFFFF 128 MB Хранилище объектов Хранилище на основе RAM для файловой системы RAM, баз данных CEDB, и реестра на основе RAM. Хранилище унаследованных данных.
ядро 0xC0000000 - 0xC7FFFFFF 128 MB XIP DLL ядра Библиотеки XIP DLL для ядра и всех серверов и драйверов, загруженных в ядре.
ядро 0xA0000000 - 0xBFFFFFFF 512 MB статически отображенная

не кэшированная

Прямой доступ к физической памяти, обходящий кэш ЦП.
ядро 0x80000000 - 0x9FFFFFFF 512 MB статически отображенная

кэшированная

Прямой доступ к физической памяти, проходящий через кэш ЦП.
пользователь 0x7FF00000 - 0x7FFFFFFF 1 MB неотображенная для защиты Буфер между пространствами пользователя и ядра.
пользователь 0x70000000 - 0x7FEFFFFF 255 MB общая системная куча

Общая куча для ядра и процесса.

Ядро и серверы ядра могут выделять в ней память и записывать в нее.

Чтение только для процессов пользователя.

Это системная организация, которая позволяет процессу получать данные из сервера, не требующая выполнения обращения к ядру.

пользователь 0x60000000 - 0x6FFFFFFF 256 MB RAM backed map files RAM backed mapfiles отображаются в фиксированное место для обратной совместимости. RAM backed map files являются файловыми объектами, отображенными в память, которые не имеют реального файла в своей основе. Они создаются при вызове CreateFileMapping с hFile равным INVALID_HANDLE_VALUE. Эта область обеспечивает обратную совместимость для приложений, которые используют RAM-backed map files для межпроцессной коммуникации, ожидая, что все процессы отображают представления в один и тот же виртуальный адрес.
пользователь 0x40000000 - 0x5FFFFFFF 512 MB Библиотеки DLL режима пользователя

Код и данные

DLL загружаются снизу вверх:
  • Начиная с адреса 0x40000000.
  • Код и данные перемешиваются.
  • DLL загружаемая в нескольких процессах будет загружаться в один и тот же адрес во всех процессах.
  • Страницы кода используют одни и те же физические страницы.
  • Страницы данных имеют уникальные физические страницы для каждого процесса.
пользователь 0x00010000 - 0x3FFFFFFF 1 GB ВП процесса выделяемая пользователем

Исполняемый код и данные.

Виртуальное распределение ВП пользователя (кучи). Распределение ВП начинается над exe и растет вверх.

пользователь 0x00000000 - 0x00010000 64 KB зависимые от ЦП данные ядра пользователя

Данные ядра пользователя всегда разрешают пользователю только чтение.

В зависимости от ЦП это может быть чтение/запись ядра (ARM), или только чтение ядра (все другие).

Пользователи могут вызывать функции ВП только на той памяти, которую они распределили с помощью VirtualAlloc, они не могут выполнять операции ВП на ВП в пространстве пользователя, распределенном ядром, таком как стеки, отображенные в память представления файлов, и данные/код DLL.

Ядро может читать и писать в общую область кучи, а процессы пользователя могут только читать общую область кучи. Назначение этой области состоит в обеспечении более эффективной коммуникации системного сервера с процессами клиента. Однако так как все процессы могут читать информацию из общей кучи, не храните никакую секретную информацию (такую как пароль) в общей куче. Между областями всегда существует неотображенная область размером как минимум 64 Кбайтов для защиты областей охвата доступа.

Пример отображения в устройстве виртуальной памяти на физическую

Рис. 6.7. Пример отображения в устройстве виртуальной памяти на физическую

Рисунок 6.7 является примером того, как адреса отображаются из пространства физической памяти в пространство виртуальной памяти. Этот конкретный пример показывает множество адресов, которые статически отображаются в ядро. Память, которая отображается статически всегда доступна, в то время как память, отображаемая динамически, будет загружаться постранично операционной системой по требованию. Страничная организация сохраняет ресурсы памяти, так как это ограничивает объем физической памяти, которая требуется для отображения используемых MMU таблиц.

Замещение страниц по требованию вызывает в ядре исключение для выполнения правильного отображения, чтобы позволить завершить конкретный доступ к памяти. Это исключение является прозрачным для приложений, но оно занимает время и требует, чтобы операционная система была в состоянии, когда она может обработать исключение.

Статически отображенные адреса требуются для обработки ситуаций, когда ошибочное исключение страницы будет вызывать сбой системы, например, обращения ядра, когда оно находится уже в обработчике исключений и во время низкоуровневой инициализации ядра. Вся память RAM/ROM в системе должна иметь статическое отображение, также как и любые размещения памяти, к которым может обращаться ISR, так как ISR также выполняются в контексте исключения.

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

Два диапазона виртуальных адресов в этом примере различаются своим использованием системного кэша. Доступ к адресам виртуальной памяти, помеченным как кэшированные, будет, возможно, попадать в кэш и не будет фактически происходить к физической памяти. Обращения к памяти в области, помеченной как некэшированная будут обходить кэш и идти прямо к физической памяти. Кэшированные обращения выполняются быстрее, потому что имеется возможность попасть в более быструю кэш-память в ЦП. Регистры аппаратных устройств являются примером адреса памяти, который должен быть сделан некэшированным, так как чтение и запись в эти устройства всегда должны обращаться к физическому оборудованию; большинство других отображений виртуальных адресов будет помечено как кэшируемые.