Архитектура встраиваемой ОС реального времени – CE 6.0
Приложения пользователя
Верхний уровень на рисунке 6.2 состоит из выполняющихся на устройстве приложений пользователя. Приложения пользователя обычно разрабатываются на C/C++ или C#. Windows CE поддерживает подмножество системных вызовов API Win32 настольной системы Windows. Это означает, что разработанные для CE приложения можно перекомпилировать для выполнения на настольной Windows, но обратное будет неверно. CE поддерживает пару тысяч вызовов API, а самая последняя настольная ОС имеет около двадцати тысяч. Вызовы API добавляются только по мере необходимости, чтобы разработать небольшое, но достаточное подмножество Win32 API. Это помогло сократить размер ядра CE. Стандартный GUI и интерфейс пользователя имеют внешний вид, похожий на настольную ОС Windows.
В дополнение к Win32 система CE предоставляет поддержку для нескольких интерфейсов программирования Microsoft, включая COM, ActiveX, MFC, и ATL. Объектная модель компонентов (COM) компании Microsoft предлагает стандарт создания компонентов, которые можно повторно использовать и объединять в более крупные системы. COM определяет двоичные объекты, которые можно запрашивать во время выполнения. Модель COM является независимой от языка. Элемент управления ActiveX является специальным типом объекта COM, используемым для расширяемых элементов управления. Элемент управления ActiveX обычно предоставляет интерфейс пользователя и предоставляет свойства, методы, и события.
Microsoft Foundation Classes (MFC) является библиотекой классов для разработки приложений Windows на C++. Она имеет в основном такие же функциональные возможности, как и Win32 API, но в инфраструктуре объектно-ориентированного приложения. Active Template Library (ATL) является библиотекой шаблонов C++, созданной для разработки элементов управления ActiveX и других компонентов COM.
Можно разрабатывать приложения, которые выполняются на устройстве на основе CE вместе с разработкой ядерной ОС в качестве подпроекта, или приложения можно разрабатывать на основе импортированного Пакета разработки программного обеспечения (SDK). Разработчики приложений, использующие SDK, могут работать на уровне интерфейса прикладного программирования (API) и не должны понимать низкоуровневые детали ОС и разработки драйверов для нового устройства. В любом случае приложения разрабатываются с помощью Visual Studio 2005 IDE. Разработка приложений и примеры кода будут рассмотрены подробнее в главе 8.
Все приложения на основе CE состоят из процесса и одного или нескольких потоков:
- Процесс является единичным экземпляром выполняющегося приложения.
- Поток является базовой единицей, которой ОС CE выделяет время процессора. Поток может выполнять любую часть кода процесса, включая части, которые выполняются другим потоком.
ОС обеспечивает функции и структуры API процесса и потока для выполнения таких операций, как создание и завершение процесса или потока, и извлечение информации о процессе и потоке. Имеется ряд методов синхронизации, включая критические разделы, взаимные исключения (мьютексы), события, и семафоры.
Многие API реализуются в динамически подключаемых библиотеках (DLL). Динамическое связывание позволяет модулю включать только ту информацию, которая нужна системе во время загрузки или во время выполнения для обнаружения кода функции экспортированной динамически подключаемой библиотеки (DLL). Динамическое связывание отличается от статического связывания, во время которого редактор связей копирует код функции библиотеки в каждый модуль, который ее вызывает.
Библиотека codedll.dll автоматически связывается с каждым приложением для предоставления поддержки для базовых API. Некоторым API будет требоваться соединение приложения с дополнительными библиотеками DLL. Проверьте оперативную справочную информацию о конкретном API, чтобы узнать, не требуются ли дополнительные DLL.
.NET Compact Framework обеспечивает поддержку для выполняющихся в CE приложений C# и Visual Basic.
Вызовы системного API
Прикладные программы используют вызовы системного API для использования служб и средств ОС. Системный вызов является функцией, которая располагается в другом процессе, и о которой уведомляет NK.exe. Ядро затем вызывает подходящий серверный процесс для обработки системного вызова.
Как видно на рисунке 6.3, когда приложение CE 6.0 делает системный вызов API
- Выполняется переход защищенной серверной библиотеки (PSL) в ядро (Kernel)
- Приложение остается отображенным во время этого вызова
Затем ядро CE
- Проверяет параметры системного вызова API
- Вызывает соответствующую службу
Наконец, требуемая служба
- Выполняется
- И передает управление непосредственно в приложение
Каждый системный вызов вызывает исключение, которое перехватывается ядром. Когда процесс вызывает системный вызов, он обращается к функции оболочки для этого системного вызова, которая определена в Coredll.dll. Эта функция готовит параметры функции для ядра и вызывает программное исключение. Это исключение может быть неопределенным адресным исключением или ловушкой ЦП.
Ядро затем обрабатывает это исключение и определяет правильный процесс адресат для отправки запроса вызова функции, или какой файл .exe может выполнить запрос. Процесс, который владеет функцией, выполняет ее, используя те же самые значения стека и регистра, которые содержит исходный поток в вызывающем процессе. Так как вызов функции существует в другом процессе, существование этого процесса должно проверяться, чтобы успешно выполнить системный вызов.
Во время всего процесса поток режима пользователя является тем же самым потоком, который выполняется в пространстве процесса для системного файла .exe. Когда поток мигрирует, его права доступа изменяются, чтобы отразить процесс, в котором он действует.
Ядро
Ядро, которое представлено модулем NK.exe (New Kernel), является основой операционной системы CE (ОС). Ядро предоставляет базовые функции ОС для любого устройства на основе CE. Эти функции включают управление процессами, потоками, и памятью. Ядро также предоставляет некоторые функции управления файлами. Службы ядра позволяют приложениям использовать эти базовые функции. Рисунок 6.4 показывает общую структуру, выделяя ядро в качестве канала для остальной части базовой ОС.
Используйте процесс ядра и функции потока для создания, прекращения и синхронизации процессов и потоков, и для планирования выполнения и приостановки потока. Процессы, которые представляют одиночные экземпляры выполняющихся приложений, позволяют пользователям работать над более чем одним приложением в данное время. Потоки позволяют приложению выполнять более одной задачи в данный момент. Уровни приоритета потоков, наследование приоритетов, поддержка прерываний, и распределение по времени и планирование выполнения включены в архитектуру ядра CE. Все вместе они предоставляют средства приложения реального времени для критических по времени систем.
Ядро CE использует страничную систему виртуальной памяти для управления и распределения памяти программ. Система виртуальной памяти предоставляет непрерывные блоки памяти страницами по 4096 байтов в областях по 64 Кбайтов, так чтобы приложениям не нужно было управлять реальным распределением памяти. Для требований памяти менее 64 Кбайтов приложение может использовать локальную кучу, предоставляемую всем приложениям CE, и создавать отдельные кучи. Ядро также распределяет память в стеке для каждого нового процесса или потока. Используйте функции памяти из ядра для распределения и освобождения виртуальной памяти, использования памяти в локальной куче, создания отдельных куч, и распределения памяти из стека. Код программы может использовать неиспользуемую память из статического блока данных, который выделяется для загрузки приложения. Процессы также могут использовать отображенные в память объекты для общего доступа к данным.