Motorola Q Phone выполняет Windows Mobile. Базовой технологией Windows Mobile
Чтобы лучше понять свойства и возможности Операционной системы реального времени (ОСРВ -
Windows Embedded CE является популярной коммерческой операционной системой реального времени, используемой во многих встроенных устройствах. CE не является просто модифицированной версией настольных операционных систем Windows, это совершенно другая ОС. Она была разработана с самого начала в середине 1990-х для предоставления ОС реального времени для встраиваемых устройств с меньшим объемом памяти и мощностью процессора, чем у настольного ПК. CE является также базовой технологией для устройств Windows Automotive и Windows Mobile, включая
Мы будем использовать CE в качестве ОС для нашей встраиваемой компьютерной системы eBox 2300 в лабораторных проектах. В этой главе обсуждение будет ограничено самой новой версией CE 6.0.
Время реакции CE в реальном времени быстрее, а размер ядра обычно меньше, чем у настольной ОС общего назначения. Как видно на рисунке 6.1, система CE 6.0 может выполнять максимум 32000 одновременных процессов, каждый с 2 Гбайтами адресного пространства виртуальной памяти. Вспомните, что объем физической памяти, имеющейся в компьютере, не зависит от адресного пространства виртуальной памяти (устройству, выполняющему CE, не требуется 4 Гбайт физической RAM).
(рис 6.1) Модель пространства виртуальной памяти Windows Embedded CE 6.0
CE имеет кросс-компиляторы C/C++ и C#, систему сборки, и большой набор инструментов отладки, которые выполняются на настольном ПК. Эти инструменты могут также использоваться в ОС или разработчиками приложений. Также включены браузер, WordPad, служба обмена сообщениями, медиа-плеер, и несколько игр. Настольный ПК обычно соединяется с целевой системой для задач разработки. Специальный инструмент на основе GUI, называемый Platform Builder, который выполняется в Visual Studio, используется для генерации нового ядра ОС. Поддерживается несколько различных семейств популярных встраиваемых процессоров, включая X86, ARM, SHx, и MIPS. Архитектура системы CE показана на рисунке 6.2. Объекты в синем, поставляются вместе с ОС, OEM обычно предоставляют объекты, показанные в зеленом, а прикладные программы предоставляют объекты, показанные в желтом.
(рис 6.2) Архитектура Windows Embedded CE 6.0
Архитектура CE создана вокруг двух режимов привилегий, Kernel и User. Фундаментальные системные компоненты, предоставляющие базовые службы в операционной системе, выполняются в привилегированном режиме Kernel, в то время как процессы пользователя (приложения) и библиотеки dll выполняются в непривилегированном режиме User. Привилегированные компоненты включают ядро, менеджера устройств, менеджера файловой системы, и GWES. Привилегированные компоненты ядра всегда присутствуют, независимо от того, какой процесс пользователя выполняется. Один процесс режима пользователя является резидентным в данный момент, изолированным от других процессов режима пользователя и от ядра.
Потоки, выполняющиеся в процессах режима пользователя, выполняют вызовы системного API, которые обрабатываются другим компонентом, часто располагающимся в ядре. Потоки должны мигрировать в серверный процесс, расположенный в ядре или другом процессе пользователя, чтобы завершить вызов API. Этот переход из непривилегированного процесса режима пользователя в другой процесс требует дорогостоящей поддержки ядра. Буферы памяти, передаваемые между процессами или в ядро, должны проверяться и маршализоваться для правильного доступа, что также требует дополнительной работы ядра.
Компоненты, выполняющиеся в привилегированном режиме ядра, не создают накладных расходов прерывания ядра и каких-то требований маршализации данных, так как они всегда присутствуют и уже являются привилегированными. Вызовы между компонентами режима ядра делаются непосредственно без вмешательства ядра. Многие вызовы API требуют поддержки от ряда различных системных серверов (filesys, device, kernel, и т.д.) для завершения одного вызова. Эти системные серверы были перемещены из отдельных процессов режима пользователя в ядро в CE6, исключая тем самым большую часть накладных расходов. Это изменение ответственно за значительное увеличение производительности многих вызовов системного API по сравнению с предыдущими версиями операционной системы.
Верхний уровень на рисунке 6.2 состоит из выполняющихся на устройстве приложений пользователя. Приложения пользователя обычно разрабатываются на C/C++ или C#.
В дополнение к Win32 система CE предоставляет поддержку для нескольких интерфейсов программирования Microsoft, включая COM, ActiveX, MFC, и
Microsoft Foundation Classes (MFC) является библиотекой классов для разработки приложений Windows на C++. Она имеет в основном такие же функциональные возможности, как и Win32 API, но в инфраструктуре объектно-ориентированного приложения. Active Template Library (
Можно разрабатывать приложения, которые выполняются на устройстве на основе CE вместе с разработкой ядерной ОС в качестве подпроекта, или приложения можно разрабатывать на основе импортированного Пакета разработки программного обеспечения (SDK). Разработчики приложений, использующие SDK, могут работать на уровне интерфейса прикладного программирования (API) и не должны понимать низкоуровневые детали ОС и разработки драйверов для нового устройства. В любом случае приложения разрабатываются с помощью Visual Studio 2005 IDE. Разработка приложений и примеры кода будут рассмотрены подробнее в главе 8.
Все приложения на основе CE состоят из процесса и одного или нескольких потоков:
ОС обеспечивает функции и структуры API процесса и потока для выполнения таких операций, как создание и завершение процесса или потока, и извлечение информации о процессе и потоке. Имеется ряд методов синхронизации, включая критические разделы, взаимные исключения (мьютексы), события, и семафоры.
Многие API реализуются в динамически подключаемых библиотеках (DLL). Динамическое связывание позволяет модулю включать только ту информацию, которая нужна системе во время загрузки или во время выполнения для обнаружения кода функции экспортированной динамически подключаемой библиотеки (DLL). Динамическое связывание отличается от статического связывания, во время которого редактор связей копирует код функции библиотеки в каждый модуль, который ее вызывает.
Библиотека codedll.dll автоматически связывается с каждым приложением для предоставления поддержки для базовых API. Некоторым API будет требоваться соединение приложения с дополнительными библиотеками DLL. Проверьте оперативную справочную информацию о конкретном API, чтобы узнать, не требуются ли дополнительные DLL.
.NET Compact Framework обеспечивает поддержку для выполняющихся в CE приложений C# и Visual Basic.
Прикладные программы используют вызовы системного API для использования служб и средств ОС. Системный вызов является функцией, которая располагается в другом процессе, и о которой уведомляет NK.exe. Ядро затем вызывает подходящий серверный процесс для обработки системного вызова.
(рис 6.3) Системные вызовы CE 6.0
Как видно на рисунке 6.3, когда приложение CE 6.0 делает системный вызов API
Затем ядро CE
Наконец, требуемая служба
Каждый системный вызов вызывает исключение, которое перехватывается ядром. Когда процесс вызывает системный вызов, он обращается к функции оболочки для этого системного вызова, которая определена в Coredll.dll. Эта функция готовит параметры функции для ядра и вызывает программное исключение. Это исключение может быть неопределенным адресным исключением или ловушкой ЦП.
Ядро затем обрабатывает это исключение и определяет правильный процесс адресат для отправки запроса вызова функции, или какой файл .exe может выполнить запрос. Процесс, который владеет функцией, выполняет ее, используя те же самые значения стека и регистра, которые содержит исходный поток в вызывающем процессе. Так как вызов функции существует в другом процессе, существование этого процесса должно проверяться, чтобы успешно выполнить системный вызов.
Во время всего процесса поток режима пользователя является тем же самым потоком, который выполняется в пространстве процесса для системного файла .exe. Когда поток мигрирует, его права доступа изменяются, чтобы отразить процесс, в котором он действует.
Ядро, которое представлено модулем NK.exe (New Kernel), является основой операционной системы CE (ОС). Ядро предоставляет базовые функции ОС для любого устройства на основе CE. Эти функции включают управление процессами, потоками, и памятью. Ядро также предоставляет некоторые функции управления файлами. Службы ядра позволяют приложениям использовать эти базовые функции. Рисунок 6.4 показывает общую структуру, выделяя ядро в качестве канала для остальной части базовой ОС.
Используйте
Ядро CE использует страничную систему виртуальной памяти для управления и распределения памяти программ. Система виртуальной памяти предоставляет непрерывные блоки памяти страницами по 4096 байтов в областях по 64 Кбайтов, так чтобы приложениям не нужно было управлять реальным распределением памяти. Для требований памяти менее 64 Кбайтов приложение может использовать локальную кучу, предоставляемую всем приложениям CE, и создавать отдельные кучи. Ядро также распределяет память в стеке для каждого нового процесса или потока. Используйте функции памяти из ядра для распределения и освобождения виртуальной памяти, использования памяти в локальной куче, создания отдельных куч, и распределения памяти из стека. Код программы может использовать неиспользуемую память из статического блока данных, который выделяется для загрузки приложения. Процессы также могут использовать отображенные в память объекты для общего доступа к данным.
(рис 6.4) Архитектура ядра CE 6.0
В устройстве на основе CE память ROM используется для хранения всей операционной системы (ОС), а также приложений, которые поставляются вместе с ОС. Используется отображение виртуальной памяти для уменьшения фрагментации памяти и обеспечения защиты памяти.
Виртуальная память с замещением страниц по требованию в файле подкачки на жестком диске обычно не используется, в отличие от популярных настольных операционных систем.
Многие устройства не имеют жесткого диска, и это также требует больше энергии. Флэш-память имеет также ограниченное количество циклов записи, что делает ее плохим выбором для устройства файла подкачки.
Виртуальная память с замещением страниц по требованию, использующая файлы подкачки, может также оказывать отрицательное виляние на производительность в реальном времени самой ОС, особенно когда компьютеру не хватает физической памяти, и возникает избыточная перегрузка при обмене между RAM и дисковым файлом подкачки.
В CE, когда инициализируется процесс, ОС отображает следующие DLL и компоненты памяти:
Библиотеки DLL и разделы чтения/записи ROM DLL загружаются, начиная с вершины адресного пространства. Библиотеки DLL управляются загрузчиком, который загружает все DLL по одному и тому же адресу для каждого процесса. Стек, куча, и исполняемый файл (.exe) создаются и отображаются с нижней части адресного пространства. Нижние 64 Кбайта памяти всегда остаются свободными.
Для CE 6.0
Так как доступ к виртуальной памяти транслируется в аппаратный доступ через
Центральные процессоры ARM и x86 используют аппаратные таблицы страниц, так что содержимое виртуальной памяти доступно непосредственно оборудованию, в то время как другие ЦП используют программный буфер опережающей выборки при передачах (TLB) miss handler, где содержимое виртуальной памяти необходимо заполнить, чтобы TLB действовал.
Рисунок 6.5 показывает внутреннее отображение адресного пространства виртуальной памяти для процесса пользователя.
(рис 6.5) Отображение виртуальной памяти пространства пользователя
Проектные задачи управления виртуальной памятью в CE 6.0 включают:
(рис 6.6) Отображение виртуальной памяти пространства ядра
Рисунок 6.6 показывает внутреннее отображение адресного пространства виртуальной памяти. Таблица 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 | Библиотеки |
|
| ядро | 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 загружаются снизу вверх: |
| пользователь | 0x00010000 - 0x3FFFFFFF | 1 GB | ВП процесса выделяемая пользователем | Исполняемый код и данные. Виртуальное распределение ВП пользователя (кучи). Распределение ВП начинается над exe и растет вверх. |
| пользователь | 0x00000000 - 0x00010000 | 64 KB | зависимые от ЦП данные ядра пользователя | Данные ядра пользователя всегда разрешают пользователю только чтение. В зависимости от ЦП это может быть чтение/запись ядра (ARM), или только чтение ядра (все другие). |
Пользователи могут вызывать функции ВП только на той памяти, которую они распределили с помощью VirtualAlloc, они не могут выполнять операции ВП на ВП в пространстве пользователя, распределенном ядром, таком как стеки, отображенные в память представления файлов, и данные/код DLL.
Ядро может читать и писать в общую область кучи, а процессы пользователя могут только читать общую область кучи. Назначение этой области состоит в обеспечении более эффективной коммуникации системного сервера с процессами клиента. Однако так как все процессы могут читать информацию из общей кучи, не храните никакую секретную информацию (такую как пароль) в общей куче. Между областями всегда существует неотображенная область размером как минимум 64 Кбайтов для защиты областей охвата доступа.
(рис 6.7) Пример отображения в устройстве виртуальной памяти на физическую
Рисунок 6.7 является примером того, как адреса отображаются из пространства физической памяти в пространство виртуальной памяти. Этот конкретный пример показывает множество адресов, которые статически отображаются в ядро. Память, которая отображается статически всегда доступна, в то время как память, отображаемая динамически, будет загружаться постранично операционной системой по требованию. Страничная организация сохраняет ресурсы памяти, так как это ограничивает объем физической памяти, которая требуется для отображения используемых
Замещение страниц по требованию вызывает в ядре исключение для выполнения правильного отображения, чтобы позволить завершить конкретный доступ к памяти. Это исключение является прозрачным для приложений, но оно занимает время и требует, чтобы операционная система была в состоянии, когда она может обработать исключение.
Статически отображенные адреса требуются для обработки ситуаций, когда ошибочное исключение страницы будет вызывать сбой системы, например, обращения ядра, когда оно находится уже в обработчике исключений и во время низкоуровневой инициализации ядра. Вся память RAM/ROM в системе должна иметь статическое отображение, также как и любые размещения памяти, к которым может обращаться
Этот пример демонстрирует еще одно свойство архитектуры виртуальной памяти. Отметим, что физическая память отображается в два различных виртуальных адреса одновременно.
Два диапазона виртуальных адресов в этом примере различаются своим использованием системного кэша. Доступ к адресам виртуальной памяти, помеченным как кэшированные, будет, возможно, попадать в кэш и не будет фактически происходить к физической памяти. Обращения к памяти в области, помеченной как некэшированная будут обходить кэш и идти прямо к физической памяти. Кэшированные обращения выполняются быстрее, потому что имеется возможность попасть в более быструю кэш-память в ЦП. Регистры аппаратных устройств являются примером адреса памяти, который должен быть сделан некэшированным, так как чтение и запись в эти устройства всегда должны обращаться к физическому оборудованию; большинство других отображений виртуальных адресов будет помечено как кэшируемые.
Базовые службы операционной системы (ОС) состоят из ядра CE и других средств, обычных для всех разработок ОС CE. Базовые службы ОС обеспечивают низкоуровневые задачи, такие как управление процессом, потоком и памятью. Базовые драйверы устройств также являются частью базовых служб ОС CE.
Базовые службы ОС предоставляют приложениям доступ к ресурсам компьютера и средствам нижележащей ОС, таким как память, файловые системы, устройства, процессы, и потоки. Приложение, использует эти службы для управления и мониторинга ресурсов, которые ему нужны для выполнения своей работы. Приложения могут совместно с другими приложениями использовать код или информацию. Сетевые функции читают или записывают в коммуникационные порты, а также управляют рабочими режимами этих портов.
Приложения управляют специальными условиями во время выполнения. Например, они могут обрабатывать ошибки, записывать в журнал события, и обрабатывать исключения.
Приложения могут использовать также специальные функции для отладки кода и улучшения его производительности. Например, функции отладки обеспечивают пошаговое управление выполнением других процессов, а функции мониторинга производительности предоставляют подробную информацию о выполнении процесса.
CE поддерживает два вида файловых систем: файловые системы, которые управляются драйверами файловой системы, и зарегистрированные файловые системы.
Так как управляемые FSD файловые системы являются предпочтительным типом файловой системы, CE включает драйверы файловой системы (FSD - File System Drivers) для ряда файловых систем. Кроме того, разработчики встраиваемых систем могут создавать и регистрировать собственные файловые системы.
Независимо от типа памяти, все файловые системы доступны через
Драйверы зарегистрированной файловой системы включают Release-Directory File System (RELFSD), Object Store (RAM) File System, и ROM File System.
Хранилище объектов в Windows Embedded CE предоставляет постоянное хранилище для приложений и связанных с ними данных, даже когда основной источник питания недоступен, при условии, что имеется резервный источник питания. Одна или несколько микросхем памяти, которые обычно являются микросхемами энергонезависимой RAM, составляют физическое хранилище объектов.
Хотя файловые системы, базы данных и системный реестр совместно используют одну кучу памяти, они не обязательно располагаются физически в хранилище объектов. Они могут располагаться в ROM, на отдельно установленных системах, или на внешнем устройстве, таком как устройство флэш-памяти. Данные создаются и извлекаются согласно типу памяти, независимо от реального устройства хранения.
Операционная система использует хранилище объектов для выполнения следующих задач:
Файловая система и реестр будут рассмотрены более подробно. Таблица 6.2 описывает объекты файловых систем и каталога управления хранилищем, которые можно выбирать для ОС при использовании инструмента Platform Builder (Сборщик платформы) для генерации нового ядра.
| Имя объекта каталога | Описание |
|---|---|
| Compression | Интерфейс прикладного программирования (API), который сжимает данные в файловых системах RAM и ROM, а также тома баз данных. |
| API, который обеспечивает поддержку встроенной базы данных CEDB. | |
| Bit-based | Средство, которое помогает определить, какие изменения произошли в базе данных или файловой системе RAM на устройстве и поэтому должны реплицироваться на рабочем столе. Эта модель использует четыре бита на объект для репликации данных. |
| RAM and ROM File System | Драйвер файловой системы, способный читать данные из файловой системы ROM и файловой системы RAM в хранилище объектов. |
| ROM-only File System | Драйвер файловой системы, способный читать данные из файловой системы ROM. |
| Hive-based Registry | Система реестра, которая хранит данные в файлах, или ульях, которые могут храниться в любой файловой системе. |
| RAM-based Registry | Система, которая хранит все данные реестра в хранилище объектов. |
| Binary Rom Image File System | Объект каталога, который используется для загрузки части образа ОС из среды постоянного хранения в RAM для выполнения. Этот объект каталога использует вызов страниц по требованию для загрузки дополнительных модулей по мере необходимости. |
| CD/ |
Драйвер файловой системы, который поддерживает как |
| API, который предоставляет улучшенные функции баз данных, включая поддержку транзакций, доступ нескольких пользователей, несколько порядков сортировки, свойства ключей и базы данных. | |
| FAT File System | Драйвер файловой системы, который поддерживает файловую систему FAT (таблица размещения файлов). |
| Extended FAT File System | Драйвер файловой системы, который поддерживает файловую систему Extended FAT. |
| Partition Driver | Драйвер, который интерпретирует разбиения на устройстве хранения для Partition Manager. |
| Управляющая панель приложения, которая позволяет пользователю манипулировать устройствами хранения. | |
| Transaction-safe FAT File System (TFAT) | Безопасная для транзакций файловая система FAT, которая гарантирует, что таблица размещения файлов не повреждается во время энергетического цикла. |
| System Password | API, который предоставляет поддержку для аутентификации на устройстве для предотвращения неавторизованного доступа. |
| Release Directory File System | Функции, которые предоставляют поддержку для Release Directory File System |
| Silent FATFS UI | Создает файл Fatutil.dll для устройства без компонентов графического интерфейса пользователя (GUI). |
Внутренняя файловая система в целевом устройстве управляет доступом к RAM. Файловая система может также обеспечить хранение файлов в хранилище объектов, которое находится в RAM. Имеется два варианта внутренней файловой системы: файловая система RAM и ROM, и файловая система только ROM. Они обладают различными свойствами, и нужно будет выбрать правильный вариант для целевого устройства. Обе файловые системы предоставляют возможность подключения дополнительных внешних файловых систем, таких как FAT (таблица распределения файлов).
Файловая система RAM и ROM предоставляет хранение файлов в хранилище объектов, а также доступ к ROM. Хранилище объектов является корнем (root) файловой системы, и все данные ниже корня хранятся в хранилище объектов, с исключением для внешних файловых систем, которые подключаются как каталоги ниже корня. Данные в ROM доступны через каталог Windows. Файловая система RAM и ROM наиболее полезна на целевых устройствах, которые обеспечивают постоянное питание RAM, так как хранилище объектов будет потеряно, если RAM не обновляется.
Файловая система только в ROM не позволяет приложениям размещать файлы в хранилище объектов. Данные в ROM доступны через каталог Windows, а внешние файловые системы также подключаются как каталоги ниже корня. Кроме того, для файловой системы только в ROM имеется возможность выбрать, чтобы внешняя файловая система помещалась в корне файловой системы. Если файловая система подключается как корень, все данные ниже корневого каталога хранятся в этой файловой системе, за исключением других внешних файловых систем.
CE объединяет библиотеки интерфейса прикладного программирования (API) Win32, интерфейса пользователя (UI), и интерфейса графических устройств (GDI) в модуль графики, работы с окнами и подсистемы событий GWES (
GWES поддерживает все окна, диалоговые боксы, элементы управления, меню, и ресурсы, которые составляют интерфейс пользователя (UI) CE, который позволяет пользователям управлять приложениями. GWES предоставляет также пользователю информацию в форме растровых изображений, курсоров, текста и иконок.
Даже устройства на основе CE, которые не имеют графического UI, используют базовые функции GWES управления окнами и сообщениями и управления питанием.
Все приложения в CE состоят из процесса и одного или нескольких потоков:
Поток является независимой частью процесса и является базовой единицей, для которой ОС выделяет время процессора.
Для задания уровней приоритета CE использует функции CeSetThreadPriority и CeGetThreadPriority. Функция CeSetThreadPriority задает приоритет для указанного потока. Функция CeGetThreadPriority возвращает 0 (ноль) как самый высокий приоритет, и 255, как самый низкий приоритет.
Так как CE поддерживает вытесняющую мультизадачность, то это создает эффект одновременного выполнения процессом нескольких потоков. Когда процесс имеет более одного выполняющегося потока, ОС быстро переключается с одного потока на другой, так что кажется, что потоки выполняются одновременно.
Поток является траекторией выполнения в процессе. Каждый раз, когда ОС создает процесс, она создает, по крайней мере, один поток. Цель создания потока состоит в том, чтобы использовать как можно больше времени ЦП. Например, во многих приложениях полезно создавать отдельный поток для обработки заданий печати, так чтобы пользователь мог продолжать использовать приложение во время печати.
Каждый поток совместно использует все ресурсы процесса, включая его адресное пространство. Каждый поток имеет стек. Редактор связей задает размер стека для всех потоков, которые создаются в процессе ( /STACK ). Отдельный поток может иметь свой собственный размер стека, вызывая CreateThread и используя параметр STACK_SIZE_PARAM_IS_ A_RESERVATION.
Поток содержит также состояние регистров ЦП, называемое контекстом, и запись в списке выполнения системного планировщика.
Можно использовать функцию GetThreadContext для извлечения контекста определенного потока, и функцию SetThreadContext для задания контекста определенного потока.
Каждый поток в процессе действует независимо. Если вы не делаете потоки видимыми друг другу, они выполняются по отдельности и не знают о других потоках в процессе. Потоки, совместно использующие общих ресурсы, должны координировать свою работу, используя метод синхронизации.
Приложение начинается, когда планировщик системы передает одному из своих потоков управление выполнением. Планировщик системы определяет, какие потоки должны выполняться, и когда они должны выполняться. Потокам с более низким приоритетом может понадобиться подождать, пока потоки с более высоким приоритетом завершат свои задания.
Потоки могут быть в одном из следующих состояний:
Когда все потоки находятся в блокированном состоянии, CE переходит в режим ожидания, который останавливает выполнение инструкций ЦП и потребление энергии на высоких уровнях. Из режима ожидания можно переключиться в режим приостановленный, если отсутствует активность пользователя. Приостановленный режим может контролироваться OEM и приложениями. Для PeekMessage.
Планирование является важным вопросом в любой ОСРВ. Во время планирование ядро поддерживает список приоритетов каждого потока в операционной системе (ОС). Каждый процесс может содержать несколько потоков, и каждый поток является траекторией выполнения. Система планирования управляет порядком в котором эти различные траектории выполнения выстраиваются, и позволяет траекториям взаимодействовать друг с другом предсказуемым образом.
Когда в системе планирования происходят прерывания, планировщик принимает прерывания в учет и реорганизует потоки соответствующим образом. Разработчик приложения может создать миниатюрную индивидуальную систему планирования внутри потока, используя в этом потоке нити. Планировщик использует квант времени для принятия решений планирования.
(рис 6.8) Пример планирования потоков. Поток 1 имеет самый высокий приоритет и выполняется до завершения, потоки 2 и 3 имеют одинаковый приоритет и выполняются циклически по очереди
Как видно на рисунке 6.8, CE использует алгоритм квантования времени на основе приоритета для планирования выполнения потоков. Потоки с одинаковым приоритетом выполняются циклически по очереди: когда поток останавливает выполнение, выполняются все другие потоки с таким же приоритетом, прежде чем исходный поток сможет продолжить. Потоки с более низким приоритетом выполняются, только после того как все потоки с более высоким приоритетом закончатся или будут блокированы. Если выполняется поток, и разблокируется поток с более высоким приоритетом, то поток с более низким приоритетом немедленно приостанавливается и запускается поток с более высоким приоритетом.
Поток должен выполнятся в течение заданного интервала времени, называемого квантом.
Поток выполняется пока:
После того как поток использовал свой квант, и если какой-либо поток с тем же приоритетом готов к выполнению, текущий поток приостанавливается, и другой поток запускается на выполнение. Единственным исключением для этого будет ситуация, когда поток является потоком "выполняющимся до завершения", что означает, что квант потока равен 0. Потоки с квантом, заданным равным 0, никогда не прекращаются с истечением срока, и никогда не будут вытеснены потоками с таким же приоритетом.
В CE 6.0 по умолчанию используется квант времени 100 мс. Квант времени можно задавать между 1 и 100 мс. Планировщик выполняет задание с самым высоким приоритетом. Задачи с одинаковым приоритетом будут выполняться циклически друг за другом. Никакого алгоритма старения в планировщике не используется, поэтому возможна ситуация зависания (потоки или процессы с низким приоритетом, которые никогда не выполняются). Пользователям необходимо тщательно проектировать прикладные программы и благоразумно задавать уровни приоритетов, чтобы избежать зависания.
CE предлагает 256 уровней приоритета, при этом нулевой обладает наивысшим приоритетом, а 255 является самым низким приоритетом. Многие более высокие уровни приоритета (с 247 и до нуля) присваиваются приложениям реального времени, драйверам, и системным процессам.
Чтобы помешать случайному приложению снизить производительность системы, OEM может ограничить использование всех уровней приоритета между 247 и нулем только определенными OEM приложениями. Используйте CeSetThreadPriority и SetThreadPriority для задания потоку уровня приоритета. Используйте CeGetThreadPriority и GetThreadPriority для извлечения уровня приоритета потока. Система уровней приоритета имеет четыре диапазона, показанные в таблице 6.3.
| Диапазон | Описание |
|---|---|
| 0 - 96 | Зарезервировано для приложений реального времени, расположенных выше драйверов. |
| 97 - 152 | Используется драйверами устройства на базе CE по умолчанию |
| 153 - 247 | Зарезервировано для приложений реального времени, расположенных ниже драйверов. |
| 248 - 255 | Отображается в приоритеты не реального времени. |
Для мьютексов и критических разделов, чтобы исправить эту ситуацию и освободить поток с более высоким приоритетом с помощью наследования приоритета CE позволяет потоку с более низким приоритетом наследовать приоритет критически более важного потока и выполниться с более высоким приоритетом, пока он не освободит используемый им ресурс. Наследование приоритета не применяется к семафорам, которые не имеют связанного с ними определенного владельца.
Так как требуется неограниченный объем времени для освобождения инверсированного потока и это находится вне контроля ядра, то OEM теряет управление над планированием процесса. Чтобы гарантировать производительность реального времени, OEM должен гарантировать, что условие
(рис 6.9) Пример инверсии приоритета
Рассмотрим пример, показанный на рисунке 6.9, который показывает, как система без наследования приоритета могла бы привести к плохому планированию потоков.
Предположим, что приложение имеет три потока:
Поток 1 и поток 2 находятся в спящем режиме или блокированы в начале примера. Затем выполняется поток 3 и входит в критический раздел. В этот момент поток 2 начинает выполнение, вытесняя поток 3, так как поток 2 имеет более высокий приоритет. Поэтому поток 3 продолжает владеть критическим разделом.
Позже начинает выполнение поток 1, вытесняя поток 2. Поток 1 пытается войти в тот критический раздел, которым владеет поток 3, но так как им владеет другой поток, поток 1 блокируется, ожидая критический раздел.
В этом месте начнет выполняться поток 2, так как он имеет более высокий приоритет, чем поток 3, а поток 1 не выполняется. Поток 3 никогда не освободит критический раздел, который ожидает поток 1, так как поток 2 будет продолжать выполняться. Поэтому поток с самым высоким приоритетом в системе, поток 1, становится блокированным, ожидая выполнения потоков с более низкими приоритетами.
Чтобы разрешить проблему с потоками CE допускает наследование приоритета на глубину одного уровня. В предыдущем примере, когда поток 1 блокируется, так как он ждет завершения потока 3, CE повышает
После освобождения потоком 3 общего ресурса, CE восстанавливает исходный
Однако если поток 3 блокирован и ожидает, чтобы другой поток X освободил объект, CE не повышает
Производительность в реальном времени определяется для операционной системы CE следующим образом:
Система реального времени является множеством всех системных элементов, оборудования, операционной системы, и приложений, которые все должны удовлетворять системным требованиям. Операционная система реального времени (ОСРВ) является одним из элементов этой системы.
Приложение реального времени создается для управления системами с жесткими ограничениями по времени, такими как управление производственным процессом, высокоскоростными устройствами сбора данных, или телекоммуникационным коммутирующим оборудованием. Уникальной характеристикой приложения реального времени является то, что оно не только предоставляет правильный ответ, но отвечает в течение точно определенного периода времени. Ядро CE содержит функции, которые улучшают ее производительность как ОСРВ.
Следующий список показывает возможности ядра, которые поддерживает CE, как ОСРВ:
Ядро CE обеспечивает производительность реального времени за счет следующей конструкции ядра и драйверов:
Время ответа, показанное в таблице 6.4, было измерено и опубликовано для CE 5.0, а время для CE 6.0, как утверждается, будет таким же или немного лучше. Тестовая система включала следующие оборудование и программное обеспечение:
| Время ответа прерывания | старт |
старт |
|---|---|---|
| минимум | 1.2 µs | 31.7 µs |
| среднее значение | 3.3 µs | 67.2 µs |
| максимум | 13.3 µs | 103.0 µs |
Время в таблице 6.4 примерно в 10 раз быстрее, чем у Linux, согласно недавнему исследованию . Как видно на рисунке 6.10, эти времена цикла ответа на несколько порядков величины быстрее, чем можно обычно видеть у настольной ОС общего назначения Windows, и вполне укладывается в диапазон времени ответа строго определенную ОС реального времени.
(рис 6.10) Измерение производительности CE в реальном времени. Категории реального времени Слабо (Soft) и Строго (Hard) основываются на исследовании OMAC, а времена ОС определяются без каких-либо расширений сторонних поставщиков для ОС реального времени
В ОС, где несколько потоков выполняются параллельно, важно иметь возможность синхронизовать деятельность различных потоков. Вспомните, что любые процессы или потоки, которые совместно используют глобальные переменные или ресурсы, требуют использования методов синхронизации (т.е. должны удовлетворяться требования взаимного исключения в разделах критического кода, которые обращаются к глобальным переменным, ограниченного ожидания, и условия продвижения) или будет получена ошибка. CE предоставляет несколько объектов синхронизации, которые позволяют синхронизовать действия потока с действиями в другом потоке. Эти объекты включают критические разделы, мьютексы, события, и семафоры.
Критические разделы являются структурами данных, размещенные приложением (часто статически размещенные), которые инициализируются перед использованием. Это означает, что ОС фактически не владеет "экземпляром объекта", и он не может совместно использоваться процессами. Критические разделы являются крайне эффективными, когда код обычно не должен блокироваться. В этом случае нет перехода в ядро, поэтому вовлекаются незначительные реальные накладные расходы. Если он не должен блокироваться, то критический раздел фактически разрешается в эквивалент мьютекса, поэтому не является таким эффективным, если ожидается много блокировок. Профилирование кода с помощью Kernel
Мьютексы являются, как подразумевает название (
Состояние объекта семафора подает сигнал, когда его счетчик больше нуля, и не подает сигнал, когда его счетчик равен нулю. Параметр InitialCount функции CreateSemaphore() определяет начальное значение счетчика. Каждый раз, когда освобождается ожидающий поток в связи с сигналом о состоянии семафора, счетчик семафора уменьшается на единицу. Используйте функцию ReleaseSemaphore() для увеличения счетчика семафора на заданное значение. Счетчик никогда не может быть меньше нуля или больше значения, определенного параметром MaximumCount. Несколько процессов могут иметь указатели на один и тот же объект семафора, позволяя использовать объект для межпроцессной синхронизации. Для совместного использования объекта процесс может определить имя объекта семафора в вызове функции CreateSemaphore().
Объекты событий обычно используются для указания, что что-то произошло, в противоположность синхронизации доступа к общедоступному ресурсу. Начальное состояние объекта события определяется параметром InitialState. Используйте функцию SetEvent для задания состояния объекта события для сигнализации. Используйте функцию ResetEvent для сброса состояния объекта события в несигнализируемое. Когда сигнализируется состояние сброшенного вручную объекта события, оно остается сигнализирующим, пока не будет явно сброшено в несигнализируемое с помощью функции ResetEvent. Любое число ожидающих потоков, или потоков, которые в дальнейшем начинают операции ожидания для указанного объекта событий, могут освобождаться во время сигнализации состояния объекта. Когда сигнализируется состояние автоматически сброшенного объекта событий, он остается сигнализирующим, пока не будет освобожден одиночный ожидающий поток; система затем автоматически сбрасывает состояние в несигнализируемое. Если ожидающих потоков нет, то состояние объекта событий остается сигнализирующим. События могут быть также пульсирующими, что всегда будет сбрасывать объект событий снова в несигнализируемое состояние.
Состояние сброшенного вручную объекта событий, сигнализируемое функцией SetEvent,остается сигнализируемым, пока не будет явно задано как несигнализируемое состояние функцией ResetEvent. Все ожидающие потоки, или потоки, которые впоследствии начинают операции ожидания для указанного объекта событий, вызывая функции ожидания, будут освобождаться, пока сигнализируется состояние объекта. Состояние автоматически сбрасываемого объекта события, сигнализируемое функцией SetEvent, будет оставаться заданным, пока не будет освобожден одиночный ожидающий поток, когда он перейдет в несигнализируемый. Сбрасываемые вручную объекты событий, сигнализирующие функцией PulseEvent, освободят все ожидающие потоки и немедленно вернутся в несигнализирующее состояние. Автоматически сбрасываемый объект события, сигнализирующий функцией PulseEvent, освободит максимум один ожидающий поток, и немедленно переходит в несигнализирующий. Если ожидающих потоков нет, событие все равно перейдет в несигнализирующее, ничего не освобождая. Используйте функцию CloseHandle для закрытия указателя. Система закрывает указатель автоматически, когда процесс завершается. Объект события разрушается, когда будет закрыт его последний указатель.
Каждый тип объекта, такой как карта памяти, семафор, событие, очередь сообщений, мьютекс, и
Независимо от используемого метода синхронизации, поток синхронизирует себя с другим потоком, освобождая объект синхронизации, и входя затем в состояние ожидания. Объект синхронизации сообщает ОС, какое специальное событие должно произойти, прежде чем поток сможет возобновить выполнение.
Когда возникает событие, поток снова можно использовать при планировании времени ЦП. После планирования поток продолжает выполнение. Поток теперь синхронизовал свое выполнение с возникновением события.
Все процессы должны защищаться против случайного изменения данных. Однако иногда двум процессам может понадобиться коммуникация друг с другом. Один из методов, который позволяет процессам общаться, называется межпроцессной синхронизацией.
Так как несколько процессов могут иметь указатели на один и тот же объект события или мьютекс, эти объекты можно использовать для выполнения межпроцессной синхронизации. Процесс, который создает объект, может использовать указатель, возвращаемый функцией CreateEvent или CreateMutex. Другие процессы могут открывать указатель на объект, используя имя объекта в другом вызове функций CreateEvent или CreateMutex. Именованные объекты предоставляют процессам способ совместного использования указателей объектов. После того как процесс создает именованное событие или объект мьютекса, другие процессы могут использовать это имя для вызова соответствующей функции, CreateEvent или CreateMutex, чтобы открыть указатель на этот объект.
CE поддерживает для межпроцессной коммуникации модели общей памяти и передачи сообщений. Существует много ситуаций, где имеет место использование общей памяти. Наиболее распространенным является передача буфера между процессами пользователя, драйверами и серверами. Приложения пользователя также могут совместно использовать память. В CE функции CeRemoteHeapCreate и CeRemoteHeapTranslatePointer позволяют создавать кучу, которая доступна только ядру или серверу в режиме пользователя и клиенту, где сервер может выделять, освобождать, читать и писать, в то время как клиент может читать и писать, но не может исказить метаданные кучи. Отображенные в память файлы позволяют нескольким процессам общаться, используя объект файла в качестве нижележащей среды коммуникации. Файл может быть реальным или с поддержкой в памяти, а отображение обеспечивает доступ к данным с помощью обычных указателей. Операционная система заботится о том, чтобы все процессы видели одинаковые данные.
Для отображенных в память указателей в CE используйте функции CeOpenCallerBuffer, CeCloseCallerBuffer, CeAllocAsynchronousBuffer, и CeFreeAsynchronousBuffer. Используйте ReadProcessMemory вместе с WriteProcessMemory. Соедините парой указатель с идентификатором процесса и передавайте их вместе. Используйте функции VirtualAllocEx, VirtualCopyEx, и VirtualAllocCopyEx для задания альтернативных точек входа в память для процессов. Эти механизмы обычно реализуются драйверами или серверами процесса режима пользователя/ядра. CeOpenxxx/CeClosexxx на самом деле реализуются с помощью Read/WriteProcessMemory. Они являются вспомогательными функциями, используемыми обычно драйверами или серверами режима ядра/пользователя для доступа к буферу памяти клиентского процесса. Read/WriteProcessMemory могут использоваться любым процессом, но требуют указатель на
Очереди сообщений P2P позволяют процессам эффективно передавать сообщения. Это не настоящая реализация общей памяти, но имеет небольшие накладные расходы и полезна во многих сценариях. Ниже показаны предоставляемые в CE функции очереди сообщений.
CreateMsgQueue - Создает или открывает определенную пользователем очередь сообщений.OpenMsgQueue - Открывает указатель на существующую очередь сообщений.CloseMsgQueue - Закрывает ReadMsgQueue - Читает одно сообщение из очереди сообщений.WriteMsgQueue - Записывает одно сообщение из очереди сообщений.GetMsgQueueInfo - Возвращает информацию об очереди сообщений.Сообщение WM_COPYDATA посылается, когда приложение передает данные другому приложению. Сообщение WM_SYSCOPYDATA посылается, когда компонент системы передает данные другому компоненту системы.
Приложения реального времени используют прерывания для своевременного ответа на внешние события. Для этого CE разбивает обработку прерывания на два шага: процедуру обработки прерывания (
Когда прерывания разрешены и происходит прерывание, ядро вызывает зарегистрированную
Обработчик исключительных ситуаций является основной целью всех прерываний. Когда происходит прерывание, микропроцессор передает управление обработчику исключительных ситуаций в ядре. Обработчик исключений затем вызывает
Обслуживание IRQ в Windows Embedded CE 6.0 начинается с ядра, которое перехватывает все исключения, а затем определяет соответствующее действие. В случае IRQ ядро перехватывает IRQ, сохраняет регистры, поддерживаемые для
Процедура обработки прерывания (
Поток обслуживания прерывания (
После обработки прерывания
(рис 6.11) Обработка прерывания в CE с помощью процедуры ISR и потока IST
Рисунок 6.11 показывает действия, вовлеченные в обработку прерывания в CE:
SYSINTR_xxx ) или SYSINTR_NOP. SYSINTR во внутренней таблице и находит событие, связанное с этим ID. Он задает это событие, чтобы планировщик мог спланировать и выполнить его.WaitForSingleObject() на событии прерывания и обрабатывает прерывание. Он должен минимально очистить или отключить прерывание на устройстве, а затем вызвать InterruptDone() перед дальнейшей обработкой.InterruptDone() восстанавливает IRQ на контроллере прерываний, чтобы происходили другие прерывания. Именно поэтому она должна вызываться как можно скорее, так как другие устройства, совместно использующие прерывание, блокируются.Одним из наиболее важных аспектов производительности ядра в реальном времени является возможность обслуживать IRQ в течение строго определенного периода времени.
Задержка прерывания относится, прежде всего, к задержкам программной обработки прерываний; то есть, количеству времени, которое проходит с момента, когда внешнее прерывание приходит в процессор и до момента, когда начинается обработка прерывания. Если подкачка страниц не происходит, время задержки прерываний в CE ограничено для потоков, заблокированных в памяти. Это делает возможным тестировать задержки худшего случая - общее время до запуска
Задержка для
Чтобы предотвратить потерю и задержку высокоприоритетных прерываний, ядро CE использует вложенные прерывания. Вложенные прерывания позволяют запросам прерываний (IRQ) с более высоким приоритетом вытеснять IRQ с более низким приоритетом. Вложенные прерывания допускаются в соединении с Real-Time Priority System (Система приоритетов реального времени).
Процедура
Драйвер устройства является программой, которая абстрагирует функции физического или виртуального устройства. Драйвер устройства управляет работой этих устройств. Примерами физических устройств являются сетевые адаптеры, таймеры, и универсальные асинхронные приемо-передатчики (CEDDK для низкоуровневых операций в драйверах устройств.
Многие драйверы устройств CE реализуют потоковый интерфейс. Точками входа базового потокового интерфейса являются XXX_Open, XXX_Close, XXX_Read, и XXX_Write. Сетевые адаптеры, адаптеры дисплея, устройства мыши, клавиатуры, и другие устройства специального назначения не используют потоковый интерфейс. Эти устройства используют интерфейс, который соответствует функциям устройства. Различные процессы будут загружать различные драйверы устройств. Хотя драйверы устройств CE являются привилегированными модулями, они не должны выполняться в режиме ядра.
Большинство драйверов устройств CE состоят из зависимого от платформы драйвера (
MDD имеет следующие характеристики:
Следующий список содержит вопросы для рассмотрения при выборе между реализацией многоуровневого драйвера или монолитного драйвера:
В CE 6.0 предоставляются образцы исходного кода для ряда драйверов и предоставляется широкий ассортимент обычно используемых драйверов устройств. Более подробная информация о разработке драйверов устройств будет представлена в лекции 9.
Менеджер устройств загружает все драйверы в пространство ядра как драйверы режима ядра, если только в реестре не задан флаг DEVFLAGS_LOAD_AS_USERPROC. Драйверы режима ядра предоставляют лучшую производительность, так как они могут вызывать API ядра непосредственно используя версию ядра coredll, называемую k.coredll.dll. Драйверы ядра могут синхронно обращаться к буферам пользователя очень быстро, так как память пользователя доступно непосредственно. Драйверы режима ядра должны быть надежными, так как они имеют неограниченный доступ к памяти. Ошибка в драйвере режима ядра может испортить память ядра, вызывая отказ системы.
Назначение Инфраструктуры драйвера (устройства) режима пользователя состоит в том, чтобы позволить загрузить промежуточный драйвер в режиме пользователя. Драйвер режима пользователя не сможет обратиться к оборудованию непосредственно. Для некоторых драйверов этот метод взаимодействия будет увеличивать стабильность системы. Отображение виртуальной памяти используется для защиты ядра от программ режима пользователя. Защита памяти ядра обеспечивается тем, что драйвер выполняется в режиме пользователя.
Инфраструктура драйвера режима пользователя делится на два физических компонента. Первым компонентом является Рефлектор драйвера режима пользователя (
Когда драйвер отмечен в реестре как драйвер режима пользователя, менеджер устройства будет обращаться к Рефлектору драйвера режима пользователя. Рефлектор драйвера режима пользователя запускает соответствующий процесс Хоста драйвера режима пользователя и пересылает в него запросы В/В. Процесс Хоста драйвера режима пользователя в свою очередь пересылает запросы В/В в Драйвер режима пользователя.
(рис 6.12) Архитектура драйвера режима пользователя
Процесс использования Драйвера режима пользователя начинаются с приложения пользователя или с драйвера шины предка. Приложения пользователей и драйверы шины предка могут загружать Драйверы режима пользователя, вызывая функции ActivateDevice или ActivateDeviceEx. Приложения пользователя и драйверы шины предка могут выгрузить Драйверы режима пользователя, вызывая функцию DeactivateDevice. После загрузки любое приложение пользователя или драйвер могут обратиться к Драйверу режима пользователя, вызывая указатель устройства.
Если драйвер является Драйвером режима пользователя, обращение к ActivateDevice или ActivateDeviceEx приведет к тому, что менеджер устройств вызовет также функцию Рефлектора драйвера режима пользователя. Драйвер распознается как Драйвер режима пользователя, когда значение FLAGS задано как DEVFLAGS_LOAD_ AS_USERPROC (0x10) в ключе устройства в реестре.
Рефлектор драйвера режима пользователя, который знает об исходном процессе и процессе места назначения, использует CeFsIoControl для пересылки запроса менеджера устройства Хосту драйвера режима пользователя. Хост драйвера режима пользователя затем анализирует запрос, чтобы загрузить, выгрузить, или вызвать точку входа драйвера шины предка.
Драйвер режима пользователя имеет ограниченные права доступа к оборудованию, что не позволяет ему размешать такие запросы, как отображение физической памяти или вызов функций прерываний.
Чтобы выполнить запросы такого типа, Драйвер режима пользователя вызывает Рефлектор драйвера режима пользователя, и активирует Рефлектор драйвера режима пользователя для обработки запроса. Рефлектор драйвера режима пользователя затем проверяет запрос пользователя согласно настройкам реестра, чтобы определить, должен ли он выполнить запрошенное действие. В отличие от прерываний и отображения физических адресов Драйвер режима пользователя может, через указатель устройства и без помощи Рефлектора драйвера режима пользователя, обратиться к драйверу шины предка, независимо от того, где находится драйвер шины предка.
Реестр является системной базой данных, которая хранит информацию конфигурации для приложений, драйверов, и операционной системы. Для прикладных программ реестр наиболее часто используется для хранения информации состояния между вызовами. Например, приложение может иметь окна, которые пользователь может перемещать и изменять в размере. Перед выходом приложение может сохранить в реестре свою информацию об окнах. Затем, когда приложение запускается снова, оно может извлечь информацию и разместить соответственно его окна. ОС использует также информацию в реестре для поиска и загрузки драйверов устройств, когда появляется новое устройство с горячим подключением. Приложения пользователей, написанные для выполнения на нескольких устройствах, могут запрашивать реестр для определения, какое оборудование присутствует на устройстве.
Структура реестра CE аналогична реестру настольных версий Windows. Реестр содержит множество поддеревьев данных. Каждое поддерево состоит из ветвей, называемых ключами, и каждый ключ может содержать подключи и/или записи. Записи хранятся как пары имя/значения. В основании каждого поддерева находится корень, который определяется с помощью хорошо-известного константного значения, или HKEY.
Таблица 6.5 показывает корневые константы, поддерживаемые в CE, и краткое описание каждой:
| Корневая ключевая константа | Описание |
|---|---|
HKEY_CLASSES_ROOT |
Хранит соответствие типов файлов и данные конфигурации OLE. |
HKEY_CURRENT_USER |
Хранит специфические данные пользователя, который зарегистрирован в системе в данный момент. Это корневые точки к соответствующему ключу из HKEY_USERS. Сделанные изменения автоматически делаются в ключе пользователя в HKEY_USERS. |
HKEY_LOCAL_MACHINE |
Хранит специфические для машины данные и конфигурационную информацию для драйверов устройств и приложений. |
HKEY_USERS |
Хранит данные для всех пользователей, включая пользователя по умолчанию. |
Базовый фрагмент данных, который хранится в реестре, называется значением. Значение может быть различного типа, включая строку или двоичное значение. Каждое значение имеет имя и соответствующий фрагмент данных. Например, устройство которое выполняет программное обеспечение CE HKEY_LOCAL_MACHINE\Software\Microsoft\Pocket Word\Settings для хранения целочисленного фрагмента данных для версии Pocket Word.
Большинство операций реестра использует функции реестра. Реестр CE экспортирует функции реестра Win32 для приложений для вызова для записи или для доступа к данным времени выполнения и других. Используйте реестр для хранения данных, которые требуются приложению для каждого сеанса. Например, можно сохранить состояние приложения во время процесса выключения. При запуске приложение может восстановить предыдущие настройки. Пространство реестра ограничено, поэтому пользователи должны минимизировать использование реестра их приложениями только несколькими ключами и упаковывать данные в битовые поля, если нужно минимизировать число требуемых ключей.
CE поддерживает два типа реестров, на основе RAM и на основе улья (hive). По умолчанию CE 6.0 реализует реестр на основе улья. Тип реестра невидим для приложений, но изменяет сохраняемость, последовательность загрузки, скорость, и использование памяти на используемом устройстве. Выбор типа реестра и настроек реестра влияет также на поведение профилей пользователей. Предоставляется специальная утилита, называемая Regedit, для редактирования реестра в Platform Builder. Platform Builder генерирует начальные записи реестра для используемого устройства вместе с кодом образа ОС.
Поддержка профиля пользователя имеется во всех конфигурациях файловой системы. Никакие компоненты для использования профилей пользователей добавлять не требуется.
Реестр на основе RAM хранит все данные реестра в хранилище объектов. Это эффективно в терминах скорости и размера в устройствах, которые имеют RAM с питанием от батареи. Устройства, которые не поддерживают питание RAM во время выключения, должны копировать реестр во время выключения и восстанавливать реестр при включении питания. Реестр на основе RAM предназначен для использования в устройствах, которые часто используют теплую загрузку, но редко или никогда холодную загрузку.
Реестр на основе улья хранит данные реестра в файлах, или ульях, которые могут храниться в любой файловой системе. Это исключает необходимость выполнения резервного копирования и восстановления при выключении питания. Исключение этой работы во время загрузки и выключения питания делает процесс холодной загрузки быстрее.
Каждый файл или улей содержит совокупность данных реестра. Реестр на основе улья делится на два улья: системный улей, который содержит все системные данные, и улей пользователя, который содержит все данные, имеющие отношение к одному определенному пользователю. Многопользовательские системы будут содержать несколько ульев пользователей. Улей пользователя будет присоединяться при регистрации в системе и отсоединяться при выходе.
Регистр на основе улья предназначен для использования на устройствах, которые часто используют холодную загрузку, но редко или никогда теплую. Он также полезен на устройствах, которые требуют поддержку нескольких пользователей.
Улей является группой ключей, субключей, и значений в реестре, которые имеют множество поддерживающих файлов, содержащих резервные копии данных из улья. Улей интерпретируется как одна единица и сохраняется и восстанавливается как один файл.
Менеджер устройств (
Менеджер устройств отслеживает интерфейсы, предоставляемые драйверами, и поддерживает поиск драйверов на основе глобально уникального идентификатора (GUID). Интерфейс IClass может связать интерфейс GUID с унаследованным именем драйвера, его именем $device, или его именем $bus. Например, COM1:, $device\com1, или $bus\pci_0_3_0.
Менеджер устройств является процессом, который выполняется в операционной системе CE, отслеживая загруженные драйверы и их интерфейсы. Он выполняется постоянно и запускается из ядра. Менеджер устройств может уведомлять пользователя, когда интерфейсы устройств становятся доступны и недоступны. Пользователь или сама система может делать интерфейсы устройств доступными или недоступными. Кроме того, Менеджер устройств уведомляет ядро, что интерфейс устройства поддерживает файловые операции, такие как
CreateFile для доступа к устройствам, которые предоставляет потоковый интерфейс. Менеджер устройств посылает обратные вызовы уведомления о питании драйверам устройств и предоставляет службы управления питанием.
Менеджер устройств управляет ключом Active в реестре. Только Менеджер устройств должен обращаться к ключу Active для доступа по чтению или записи. Можно неявно обратиться к ключу Active через параметр функции инициализации драйвера устройства.
Менеджер устройств ищет ключ реестра HKEY_LOCAL_MACHINE\Drivers\RootKey, чтобы определить ключ для начала обработки загрузки драйвера. Значением по умолчанию для RootKey является Drivers, но оно обычно задается как Drivers\BuiltIn. Менеджер устройств вызывает ActivateDeviceEx для загрузки драйвера, определенного значением подключа Dll, находящегося в ключе, определенном значением RootKey.
Значение подключа Dll по умолчанию будет BusEnum.dll, называемое также перечислителем шины. Загрузка BusEnum.dll вызывает загрузку всех драйверов устройств. Устройство, загруженное функцией ActivateDeviceEx, может прочитать его указатель активации из его ключа реестра Active.
Менеджер устройства связывает имя шины с драйверами. Неименованные устройства также могут иметь имя шины, так как даже если приложения могут не иметь доступа к драйверу, драйвер может быть доступен другим драйверам или системным объектам, таким как Менеджер питания. Имя шины может иметь ACL отличный от обычного имени устройства.
Драйверы могут программным путем объявлять интерфейсы, вызывая DMAdvertiseInterface. Функция DMAdvertiseInterface позволяет драйверам добавить дополнительные GUID для поиска в их соответствующих списках. DMAdvertiseInterface предоставляет библиотека Devmgr.dll, которая также реализует большую часть функций Менеджера устройств. Так как только Менеджер устройств может загрузить Devmgr.dll, только драйверы устройств могут вызывать DMAdvertiseInterface. Если драйвер устройства не объявляет о недоступности своих интерфейсов, когда драйвер выгружается, Менеджер устройств автоматически очищает уведомление объявления интерфейса.
Менеджер устройств состоит из Device.exe и Devmgr.dll. Device.exe содержит библиотеку Devmgr.dll, которая реализует базовые функции Менеджера устройств. Так как Менеджер устройств состоит из двух отдельных модулей, драйверы устройств могут соединяться непосредственно с Менеджером устройств и вызывать определенные функции, такие как DMAdvertiseInterface, не создавая накладных расходов системного вызова. Таблица 6.6 показывает компоненты Менеджера устройств.
| Компонент | Описание |
|---|---|
devcore |
Предоставляет базовые функции Менеджера устройств. |
iorm |
Предоставляет функции менеджера ресурсов В/В. Iorm является требуемым компонентом и не может быть уделен. |
pmif nopmif Pmif |
Предоставляет интерфейс к точкам входа DLL Менеджера питания. Nopmif предоставляет версию с заглушками точек входа Менеджера питания. |
Драйвер устройства является программой, которая абстрагирует функции физического или виртуального устройства. Драйвер устройства управляет работой этих устройств. Различные процессы загружают различные драйверы. Таблица 6.7 показывает процессы, которые загружают драйверы, и какие драйверы загружает каждый процесс.
| Процесс | Драйверы |
|---|---|
| File System (FileSys.dll) | FileSys.dll загружает драйверы файловой системы. Дополнительная информация в разделе по файловым системам. |
| Device.exe загружает аудио драйверы, драйверы батареи, драйверы клавиатуры, драйверы мыши, драйверы |
|
| GWES.dll загружает драйвер устройства, если GWES является единственным клиентом драйвера. Драйверы устройств, загруженные GWES, представляют стандартное множество функций для всех аналогичных устройств. Драйверы, которые загружает GWES, могут представлять потоковый интерфейс, или они могут представлять другие интерфейсы. Наличие альтернативных вариантов делает доступ к драйверам значительно быстрее. GWES загружает драйверы дисплея, драйверы принтера, и драйверы сенсорного экрана. |
Когда система загружается, перечислитель шины перечисляет рееестр и загружает все встроенные устройства, на основе этой информации из реестра. Можно сконфигурировать эту информацию реестра. Менеджер ресурсов В/В затем отслеживает текущее состояние доступных в системе ресурсов, и управляет всеми дальнейшими запросами и распределениями ресурсов В/В драйверов шины. Следовательно, все драйверы шины должны запрашивать ресурсы В/В у менеджера ресурсов В/В, когда они загружают драйвер клиента для устанавливаемых устройств или других типов устройств.
Менеджер ресурсов В/В является неотъемлемой частью Менеджера устройств. Менеджер ресурсов В/В отслеживает доступные системные ресурсы, инициализированные из реестра перед загрузкой каких-либо устройств. Отслеживание этих ресурсов предотвращает случайные коллизии, когда два или несколько драйверов попытаются использовать одни и те же ресурсы.
OAL и реестр обычно предварительно распределяют ресурсы пространства В/В и IRQ, которые запрашивают драйверы шины. Однако Менеджер ресурсов В/В не ограничен управлением пространствами В/В и IRQ. Определенное множество доступных ресурсов может включать все, что вы определяете. Драйверы шины, такие как драйвер шины PCI, ресурсы запроса пространства В/В и IRQ у Менеджера ресурсов В/В, когда он загружает драйверы устройств для устройств, которые находит. То же самое справедливо для драйвера шины
Каждая аппаратная платформа имеет уникальные IRQ и доступное пространство В/В. IRQ для встроенных и фиксированных устройств должны отображаться в идентификаторы прерываний ( SYSINTR ) в OAL. IRQ для встроенных и фиксированных устройств должны исключаться из доступных ресурсов. IRQ используемые с шиной PCI обычно являются совместно используемыми.
IRQ и ресурсы пространства В/В являются предопределенными. Ключи реестра HKEY_LOCAL_MACHINE\Drivers\Resources\IRQ и ключи реестра HKEY_LOCAL_MACHINE\Drivers\Resources\IO предоставляют начальное состояние Менеджера ресурсов В/В.
Загрузчик CE отвечает за загрузку модулей, которые состоят, как из исполнимых файлов, так и динамически подключаемых библиотек (DLL), в виртуальную память, так что они могут выполняться операционной системой. Каждый модуль может иметь несколько связанных с ним флагов в конфигурационном файле Config.
Для каждого модуля можно задать следующие свойства:
Загрузчик обрабатывает также несколько выполняемых на месте (
Встраиваемые устройства часто работают от батарей, и даже устройства работающие от источника переменного тока необходимо проектировать с учетом эффективного потребления энергии.
Длительная работа от батареи является одним из основных конструкционных рассмотрений в таких устройствах, как сотовые телефоны. Большинство операционных систем включают поддержку для управления питанием, отключая части оборудования и возможно замедляя частоту работы процессора во время периодов неактивности. Следующая иллюстрация показывает состояния питания и переходы в CE 6.0.
(рис 6.13) Состояния питания и переходы CE 6.0
Менеджер питания позволяет управлять устройствами просто и независимо от базовой модели управления питанием в CE. В базовой модели питания CE устройства получают уведомления, что ОС приостанавливает и возобновляет работу. Это уведомление происходит в контексте прерывания, поэтому устройства строго ограничены в отношении того, что они могут делать во время приостановленного состояния, и как долго они могут это делать. Рисунок 6.13 показывает архитектуру управления питанием для CE.
Таблица 6.7 описывает переходы между состояниями для CE - в зависимости от используемого устройства.
| Переход | Описание |
|---|---|
Power-on reset |
Используемое устройство очищает рабочую RAM и инициализирует файловую систему. |
|
Первое применение питания, например, когда устанавливается резервная батарея. |
|
Переход из состояния питания On. Теплая загрузка очищает рабочую RAM. |
On-to-Idle |
Переход из полностью выполняющегося состояния в состояние, в котором микропроцессор использует мало энергии. |
Idle-to-On |
Переход микропроцессора из маломощной к работе в полную мощность. |
On-to-Suspend |
Переход к остановке микропроцессора в результате определенных событий. Вызывается функция XXX_PowerDown драйвера устройства. |
Suspend-to-On |
Переход остановленного микропроцессора к работе в полную мощность на основе определенных пробуждающих событий. Вызывается функция XXX_PowerUp драйвера устройства. |
On-to-Critical off |
Переход, когда обнаруживается критически низкое напряжение питания. Для устройства необходимо реализовать функцию перехода в состояние Critical Off. |
(рис 6.14) Архитектура Менеджера питания CE 6.0
Используя Менеджер питания устройства получают уведомления об изменении состояния питания как управляющие коды В/В (IOCTL). Так как IOCTL выполняются в контексте потока, разработчики драйвера имеют значительно большую гибкость в том, как они реализуют изменение состояния питания. Использование IOCTL для управления питанием позволяет также разделить состояние питания устройства и общее состояние питания ОС. Поэтому некоторые устройства можно выключить во время работы ОС, а другие можно оставить включенными, когда большая часть ОС приостановлена.
Кроме управления питанием устройства Менеджер питания уведомляет приложения о связанных с питанием событиях. Например, Менеджер питания информирует заинтересованные приложения, когда ОС восстанавливается из приостановленного состояния.
Менеджер питания реализован как динамически подключаемая библиотека (DLL), называемая Pm.dll, которая компонуется непосредственно с Device.exe. Device.exe вызывает точки входа в Pm.dll, когда вызываются
Менеджер питания действует как посредник между устройствами, приложениями, и определяет состояния питания ОС. Он реализует следующее множество правил коммуникации между тремя этими частями:
Если минимальная граница потребления энергии задана выше, чем максимальная, питание устройства будет оставаться повышенным, пока устройство требуется приложению.
Устройства могут реализовать один или несколько состояний питания устройства. Количество состояний питания устройства ограничено. Если ОС переходит в приостановленное состояние, наложенные приложением минимальные ограничения на питание будут задаваться отдельно, пока ОС находится в приостановленном состоянии.
Состояния питания системы описывают для всех устройств максимальное состояние питания устройства. Системные состояния питания определяются OEM, описываются в реестре, и могут дополнительно иметь код для их поддержки в Менеджере питания. OEM может определить любое число системных состояний питания.
В инфраструктуре Менеджера питания OEM определяет состояния питания ОС, которые устанавливают максимальные состояния питания устройства. Устройства вызывают функцию DevicePowerNotify для регулировки своих собственных уровней питания, а приложения вызывают функцию SetPowerRequirement для проверки, что требуемые им устройства выполняются на приемлемом уровне производительности.
Менеджер питания управляет питанием устройств и улучшает общую эффективность питания операционной системы, обеспечивает управление питанием для каждого устройства, и сосуществуют с приложениями и драйверами, которые не поддерживают Менеджер питания. Можно использовать управление питанием для уменьшения потребления питания используемого устройства и для поддержки и сохранения файловой системы в RAM во время состояний питания on, idle, и suspend.
Менеджер питания предоставляет также следующие возможности:
Менеджер питания ожидает, что все управляемые устройства поддерживают одно или несколько состояний питания устройства. Существует ограниченное число состояний питания устройства, и устройство должно информировать Менеджер питания о своих характеристиках потребления энергии. Состояния питания устройства обычно обеспечивают производительность за счет дополнительного потребления энергии.
Менеджер питания управляет состояниями питания устройства в контексте состояний питания системы, которые определены OEM.
Состояния питания системы описываются в реестре, где можно определить любое число состояний. Состояния питания системы определяют верхнюю границу для состояний питания устройства.
Некоторые приложения могут требовать, чтобы заданное устройство обслуживалось на определенном уровне питания устройства. Например, приложение потокового аудио может требовать, чтобы его сетевая карта и аудио-кодек оставались с высоким уровнем питания во время воспроизведения музыки. Приложение потокового видео может нуждаться в сети и аудио, плюс оно может требовать, чтобы дисплей не переходил в режим хранителя экрана, и возможно, поддерживать включенной подсветку. Приложения могут требовать, чтобы Менеджер питания задавал требования минимального состояния питания устройства, используя функции API SetPowerRequirement и ReleasePowerRequirement.
Службы безопасности являются существенной частью любой современной операционной системы. Службы коммуникации, приложения пользователей, файловые системы и хранилища данных, и службы Интернет все требуют защиты секретной информации. CE предоставляет набор инструментов для улучшения безопасности устройства. Однако пользователь отвечает за тщательный анализ безопасности устройства и выбор компонентов ОС, подходящих для устройства. При добавлении каждого нового свойства, разработчики должны тщательно рассматривать последствия для безопасности.
Доступны следующие технологии обеспечения улучшенной безопасности в устройствах и приложения:
(рис 6.15) Архитектура системы безопасности CE
Сетевые свойства и поддержка сети являются критически важным компонентом любой современной операционной системы. CE предоставляет ряд сетевых служб и свойств. CE предоставляет поддержку для приложений на основе Интернет. Поддерживаются следующие сетевые свойства:
Операционная система CE реализует пакет протоколов TCP/IP (Transmission Control Protocol/Internet Protocol). ОС включает стандартный стек TCP/IP, позволяющий устройствам на основе CE участвовать как одноранговые узлы сети и серверы в локальных (LAN) и удаленных сетях.
CE поддерживает следующие стандартные характеристики:
и имеет также следующие усовершенствования производительности:
Поддержка предоставляется, как для IPv4, так и для IPv6. Таблица 6.8 суммирует предоставляемые службы TCP/IP.
Архитектура пакета протоколов CE TCP/IP показана на рисунке 6.16.
(рис 6.16) Архитектура сети TCP/IP CE
| Служба | Описание |
|---|---|
| Клиент Dynamic Host Configuration Protocol (DHCP) | Клиентам DHCP динамически присваиваются различные конфигурационные параметры, такие как IP-адрес, маска подсети, используемый по умолчанию шлюз, и другие критические данные сетевой конфигурации. |
| Windows Internet Name Service (WINS) | WINS является клиентом имен NetBIOS, который управляет процессом разрешения имен, поддерживая актуальный список имен компьютеров NetBIOS и соответствующие IP-адреса. |
| Клиент Domain Name System (DNS) | CE не поддерживает размещение сервера DNS. Однако CE запрашивает сервер DNS для разрешения имен, если такой сервер существует в сети. |
| Extended DNS Querying and Update | Эта служба предоставляет протокол |
| Поддержка коммутируемого доступа (PPP/SLIP) | CE реализует коммутируемый доступ к сети с помощью |
| Печать в сети TCP/IP | ВCE TCP/IP поддерживает сетевую печать через протокол Server Message Block (SMB). Он не предоставляет Windows Line Printer Remote (LPR) |
| Агент расширения Simple Network Management Protocol (SNMP) | Агент расширения SNMP предоставляет субагента MIB-2, который позволяет управлять и контролировать состоянием TCP/IP. |
| Поддержка глобальной сети (WAN) | Эта служба предоставляет пользователям доступ в Интернет. |
| Утилиты связи TCP/IP | Базовые утилиты связи TCP/IP, включая серверы File Transfer Protocol (FTP) и telnet. Сервер telnet позволяет осуществлять удаленное администрирование через стандартного клиента telnet. Образец сервера FTP используется для копирования файлов на и с удаленных компьютерных систем через сеть с помощью TCP/IP. |
| Network Utilities | Многие инструменты разрешения сетевых проблем доступны для CE, например, ipconfig, iPv6, ipv6tun, netstat, ping route, и tracert. |
| Internet Protocol Helper (IP Helper) | IP Helper предоставляет интерфейсы прикладного программирования (API), которые помогают в сетевом администрировании локального компьютера. |
| Удаленный вызов процедуры (RPC) | Удаленный вызов процедуры Microsoft (RPC) используется для создания распределенных клиент/серверных программ. Стабы и библиотеки RPC управляют большинством процессов, связанных с сетевыми протоколами и коммуникацией. Это позволяет сосредоточиться на деталях приложения, а не на деталях сети. |
| Службы Windows HTTP (WinHTTP) | WinHTTP предоставляет разработчикам поддерживаемый сервером, высокоуровневый интерфейс с протоколом Интернет HTTP/1.1. |
| Windows Internet (WinInet) | WinInet управляет всей коммуникацией между приложением Winsock. |
| Windows Sockets (Winsock) | Приложения обращаются к стеку TCP/IP через интерфейс Winsock. |
В CE используется специальный инструмент для генерации индивидуального ядра операционной системы, называемый Platform Builder, который показан на рисунке 6.17. В CE 6.0 он выполняется в Visual Studio 2005 с SP1. В Platform Builder разработчик выбирает различные свойства ОС и необходимые драйверы устройств из объектов каталога (слева на рисунке 6.17), используя мышь для выбора необходимых объектов. Затем пользователь выбирает Build из меню верхнего уровня для сборки нового ядра ОС, используя выбранные свойства ОС. Новую ОС можно затем выполнить и отладить на эмуляторе ARM или можно быстро загрузить в требуемое устройство, соединенное с ПК с помощью сети, USB, или последовательных соединений.
(рис 6.17) Platform Builder является инструментом сборки нового образа ядра ОС
Существует большое число уникальных терминов, используемых в Platform Builder. Использование Platform Builder и различных меню будет легче, когда вы поймете следующую терминологию:
Объект каталога: Любой объект, который можно выбрать из Catalog Items View.
Шаблон конструкции: Предопределенная выборка компонентов операционной системы, которую предоставляет Microsoft для некоторой категории базовых целевых устройств. Для большинства проектов шаблон конструкции является просто быстрой начальной стартовой точкой. При сохранении или модификации шаблон конструкции становится начальным проектом ОС.
Конструкция ОС: Выборка объектов каталога, которые определяют характеристики ОС. Можно начать проект ОС с шаблона конструкции или без шаблона.
Образ времени выполнения: Программное обеспечение для развертывания на целевом устройстве, или то же самое программное обеспечение, выполняющееся на целевом устройстве. Образ времени выполнения содержит ОС и связанное с ней программное обеспечение.
Пакет поддержки платы (BSP): Программное обеспечение, которое является специфическим для аппаратной платы. Это программное обеспечение обычно включает начальный загрузчик, уровень адаптации OEM (OAL), и специфические для платы драйверы устройств.
Каталог: Контейнер выбираемых индивидуально объектов функций CE.
Компонент: Наименьшая единица функциональности, которую можно добавить в конструкцию ОС.
Конфигурация: Выборка объектов каталога и выборка определенных возможностей.
Аппаратная платформа: Архитектура оборудования для выполнения ОС CE и связанного оборудования.
Модуль: EXE или DLL, которые являются частью ОС CE.
Подпроект: Механизм отслеживания совокупности файлов, которые можно использовать для проектирования и добавления функций в ОС CE. Проекты ОС могут содержать несколько подпроектов.
Целевое устройство, устройство на основе CE: Экземпляр аппаратной архитектуры или экземпляр объединенной аппаратной и программной архитектуры.
Проект: Контейнер для всех файлов, связанных с конструкцией ОС.
Для сборки образа времени выполнения необходимо сначала создать конструкцию операционной системы, которая определяет функции, которые должен поддерживать образ времени выполнения. Имеется несколько шаблонов конструкции для различных классов устройств для использования в качестве быстрой начальной точки для новой конструкции ОС. Конструкцию ОС можно начать, выбирая шаблон конструкции, или без шаблона конструкции. Конструкция ОС соответствует множеству переменных окружения в рабочей среде сборки для Platform Builder.
(рис 6.18) Последовательность разработки нового образа ОС времени выполнения
С каждой конструкцией ОС Platform Builder по умолчанию предоставляет конфигурацию с именем Debug и конфигурацию с именем Release. Вы можете выбрать одну конфигурацию. Конфигурация определяет параметры сборки конструкции ОС. Можно модифицировать параметры сборки для каждой конфигурации. Для каждой конструкции ОС только одна конфигурация может быть активна в данный момент времени. Вариант Debug выводит больше
Затем разработчик собирает для устройства новый образ модифицированной ОС. В Platform Builder, когда вы выбираете сборку образа времени выполнения на основе конструкции операционной системы, система сборки, показанная на рисунке 6.19, выполняет следующие последовательные фазы:
(рис 6.19) Система сборки CE
Система сборки выполняет следующие задачи во время этих фаз:
Целевые устройства могут включать множество устройств, включая ARM
Пользователи новички должны использовать графический интерфейс пользователя Platform Builder для сборки системы. Опытные пользователи часто вызывают непосредственно систему сборки из командной строки, чтобы сохранить время и минимизировать время сборки. В раскрывающемся меню сборки верхнего уровня есть возможность открыть систему сборки в режиме командной строки. Повторная сборка сначала очищает все файлы, а затем запускает новую сборку.
Система сборки использует несколько типов конфигурационных файлов для сборки нового образа ОС. Эти файлы настраиваются автоматически, но при удобном случае можно сделать в этом файле изменения. Понимание основ системы сборки будет также полезно для понимания и исправления любых ошибок в сборках ОС. Конфигурационные файлы исходного кода содержат следующую информацию для инструмента Build (Build.exe):
На основе этой информации инструмент Build собирает исходный код в каталоге и указанных подкаталогах. Таблица 6.9 показывает типы конфигурационных файлов исходного кода
| Тип файла | Описание |
|---|---|
| Файл Dirs | Определяет дополнительные подкаталоги, которые содержат дополнительный исходный код. |
| Файл Makefile | Содержит переменные, необходимые для компиляции и компоновки исходного кода. |
| Файл Module-Definition | Содержит операторы, определяющие исполняемый код или динамически подключаемую библиотеку. |
| Файл Sources | Содержит макро-переменные, необходимые для сборки исходного кода. Он перечисляет подключаемые и библиотечные файлы, необходимые для |
Инструмент Build обходит дерево каталогов в поиске файлов dirs, а затем файлов sources. Файлы Dirs определяют файлы sources, которые содержат:
Когда инструмент Build находит файл sources в текущем каталоге, он вызывает инструмент Nmake (Nmake.exe), который делает одно из следующего:
Инструмент Make
| Тип файла | Описание |
|---|---|
| Определяет модули и файлы, которые будут включены в образ времени выполнения. | |
| Registry File (*.reg) | Определяет во время холодной загрузки ключи реестра и значения для созданного образа времени выполнения. |
| File |
Определяет во время холодной загрузки каталоги, файлы и ссылки файловой системы RAM для созданного образа времени выполнения. |
| Определяет во время холодной загрузки базы данных, которые будут включены в хранилище объектов созданного образа времени выполнения. | |
| String File (.str) | Определяет специфические для локализации строковые замещения для текста, который видит пользователь в файлах .reg, .dat, и .db. Каждая строка в файле .str должна заканчиваться <CR>, чтобы обеспечить правильную обработку. |
Специальные конфигурационные файлы образа времени выполнения применяются для аппаратной платформы; другие применяются к рабочим пространствам, которые содержат модули и компоненты на основе CE.
Независимо от области действия можно использовать условные блоки IF и ENDIF и переменные окружения в любом конфигурационном файле образа времени выполнения для модификации получающегося образа времени выполнения. Таблица 6.11 показывает области действия конфигурационных файлов образа времени выполнения.
| Имя файла | Область действия |
|---|---|
Common. |
Эти файлы применяются к проекту Common, который содержит базовые модули и компоненты на основе CE. |
IE. |
Эти файлы применяются к проекту IE, который содержит компоненты, которые поддерживают модули Microsoft Internet Explorer. |
Wceappsfe. |
Эти файлы применяются к проекту Wceapps, который содержит компоненты, которые поддерживают программное обеспечение обработки текста WordPad и электронного обмена сообщениями Inbox. |
Wceshellfe. |
Эти файлы применяются к проекту Wceshellfe, который содержит компоненты, которые поддерживают модули оболочки на основе CE. |
Msmq. |
Эти файлы применяются к проекту MSMQ, который содержит модули |
Platform. |
Эти файлы применяются к аппаратной платформе. |
Project. |
Эти файлы применяются к рабочему пространству, которое содержит образ времени выполнения на основе CE. |
Config. |
Этот файл применяется к образу времени выполнения. Он содержит разделы MEMORY и CONFIG для образа времени выполнения. |
Файл сборщика двоичного образа (.Makeimg.exe использует файлы .
Файл Platform. определяет
Файл Config. содержит разделы MEMORY и CONFIG для образа времени выполнения. Раздел MEMORY файла Config. определяет таблицу памяти для образа времени выполнения, определяя имя, адрес, размер, и тип областей MEMORY в образе времени выполнения.
При обновлении Platform. или Project. для включения файла определите следующие объекты:
MEMORY, определенную как тип RAMIMAGE.Используйте параметры Address и Size в таблице памяти для определения раздела памяти, предназначенного для RAM, а также для ROM. Параметр Address определяет адрес, где начинается раздел RAM. Вместе параметры Address и Size указывают адрес, где заканчивается раздел RAM.
Раздел MODULES файлов *.MEMORY файла Config.. Он модифицируется для добавления файлов *.dll и подпроектов в образ ОС.
Этот раздел может содержать до 2000 модулей, которые состоят из двух-частной комбинации исходного кода и данных. Следующий пример показывает столбцовый формат, используемый записью раздела MODULES в файле *.
| Name Path |
|---|
| MYDLL.DLL %_WINCEROOT%\RELEASE\MYDLL.DLL NK SHC |
Параметр name определяет имя входа раздела MODULES, как он появляется в таблице памяти. Обычно запись Name совпадает с именем файла, указанным Path.
Параметр path определяет полный путь доступа к файлу, как определено в разделе MODULES, который Romimage.exe включает в образ времени выполнения. Обычно имя файла Path совпадает с Name записи раздела MODULES.
Параметр определяет раздел RAMIMAGE области памяти в которую Romimage.exe загружает объектный модуль. Romimage.exe помещает объектные модули в указанное место памяти в том порядке, в котором они появляются в разделе MEMORY. Это место памяти соответствует разделу MEMORY, определенному в файле Config.. Существует только один RAMIMAGE на образ времени выполнения. Имя, которое используется для определения раздела MEMORY должно совпадать с именем, определенным в файле Config.
Параметр section override определяет тип записи раздела, как ее интерпретирует Romimage.exe, и может быть задан как или FILES. Когда этот параметр добавлен в запись, Romimage.exe игнорирует раздел, в котором находится запись, и интерпретирует запись как члена указанного раздела. Это является необязательным.
Параметр type определяет тип файла, и может быть комбинацией следующих символов:
S для определения как системного файла.H для определения как скрытого файла.R для сжатия ресурсов. Применяется только к разделу MODULES.C для сжатия всего, если применяется к модулю.D для отключения выполнения отладчика.N для пометки модуля как ненадежного. Применяется только к разделу MODULES.K для указания, что Romimage.exe должен зафиксировать модуль в адресе ядра.Несколько сайтов сообщества пользователей и новостных групп обсуждают различные темы и проблемы связанные с Windows Embedded CE:
http://msdn.microsoft.com/newsgroups /default.aspx?dg=microsoft. public.windowsce.platbuilder
http://msdn.microsoft.com/embedded/community/community/newsgrp/ default.aspx
Motorola Q Phone выполняет Windows Mobile. Базовой технологией Windows Mobile
Чтобы лучше понять свойства и возможности Операционной системы реального времени (ОСРВ -
Windows Embedded CE является популярной коммерческой операционной системой реального времени, используемой во многих встроенных устройствах. CE не является просто модифицированной версией настольных операционных систем Windows, это совершенно другая ОС. Она была разработана с самого начала в середине 1990-х для предоставления ОС реального времени для встраиваемых устройств с меньшим объемом памяти и мощностью процессора, чем у настольного ПК. CE является также базовой технологией для устройств Windows Automotive и Windows Mobile, включая
Мы будем использовать CE в качестве ОС для нашей встраиваемой компьютерной системы eBox 2300 в лабораторных проектах. В этой главе обсуждение будет ограничено самой новой версией CE 6.0.
Время реакции CE в реальном времени быстрее, а размер ядра обычно меньше, чем у настольной ОС общего назначения. Как видно на рисунке 6.1, система CE 6.0 может выполнять максимум 32000 одновременных процессов, каждый с 2 Гбайтами адресного пространства виртуальной памяти. Вспомните, что объем физической памяти, имеющейся в компьютере, не зависит от адресного пространства виртуальной памяти (устройству, выполняющему CE, не требуется 4 Гбайт физической RAM).
(рис 6.1) Модель пространства виртуальной памяти Windows Embedded CE 6.0
CE имеет кросс-компиляторы C/C++ и C#, систему сборки, и большой набор инструментов отладки, которые выполняются на настольном ПК. Эти инструменты могут также использоваться в ОС или разработчиками приложений. Также включены браузер, WordPad, служба обмена сообщениями, медиа-плеер, и несколько игр. Настольный ПК обычно соединяется с целевой системой для задач разработки. Специальный инструмент на основе GUI, называемый Platform Builder, который выполняется в Visual Studio, используется для генерации нового ядра ОС. Поддерживается несколько различных семейств популярных встраиваемых процессоров, включая X86, ARM, SHx, и MIPS. Архитектура системы CE показана на рисунке 6.2. Объекты в синем, поставляются вместе с ОС, OEM обычно предоставляют объекты, показанные в зеленом, а прикладные программы предоставляют объекты, показанные в желтом.
(рис 6.2) Архитектура Windows Embedded CE 6.0
Архитектура CE создана вокруг двух режимов привилегий, Kernel и User. Фундаментальные системные компоненты, предоставляющие базовые службы в операционной системе, выполняются в привилегированном режиме Kernel, в то время как процессы пользователя (приложения) и библиотеки dll выполняются в непривилегированном режиме User. Привилегированные компоненты включают ядро, менеджера устройств, менеджера файловой системы, и GWES. Привилегированные компоненты ядра всегда присутствуют, независимо от того, какой процесс пользователя выполняется. Один процесс режима пользователя является резидентным в данный момент, изолированным от других процессов режима пользователя и от ядра.
Потоки, выполняющиеся в процессах режима пользователя, выполняют вызовы системного API, которые обрабатываются другим компонентом, часто располагающимся в ядре. Потоки должны мигрировать в серверный процесс, расположенный в ядре или другом процессе пользователя, чтобы завершить вызов API. Этот переход из непривилегированного процесса режима пользователя в другой процесс требует дорогостоящей поддержки ядра. Буферы памяти, передаваемые между процессами или в ядро, должны проверяться и маршализоваться для правильного доступа, что также требует дополнительной работы ядра.
Компоненты, выполняющиеся в привилегированном режиме ядра, не создают накладных расходов прерывания ядра и каких-то требований маршализации данных, так как они всегда присутствуют и уже являются привилегированными. Вызовы между компонентами режима ядра делаются непосредственно без вмешательства ядра. Многие вызовы API требуют поддержки от ряда различных системных серверов (filesys, device, kernel, и т.д.) для завершения одного вызова. Эти системные серверы были перемещены из отдельных процессов режима пользователя в ядро в CE6, исключая тем самым большую часть накладных расходов. Это изменение ответственно за значительное увеличение производительности многих вызовов системного API по сравнению с предыдущими версиями операционной системы.
Верхний уровень на рисунке 6.2 состоит из выполняющихся на устройстве приложений пользователя. Приложения пользователя обычно разрабатываются на C/C++ или C#.
В дополнение к Win32 система CE предоставляет поддержку для нескольких интерфейсов программирования Microsoft, включая COM, ActiveX, MFC, и
Microsoft Foundation Classes (MFC) является библиотекой классов для разработки приложений Windows на C++. Она имеет в основном такие же функциональные возможности, как и Win32 API, но в инфраструктуре объектно-ориентированного приложения. Active Template Library (
Можно разрабатывать приложения, которые выполняются на устройстве на основе CE вместе с разработкой ядерной ОС в качестве подпроекта, или приложения можно разрабатывать на основе импортированного Пакета разработки программного обеспечения (SDK). Разработчики приложений, использующие SDK, могут работать на уровне интерфейса прикладного программирования (API) и не должны понимать низкоуровневые детали ОС и разработки драйверов для нового устройства. В любом случае приложения разрабатываются с помощью Visual Studio 2005 IDE. Разработка приложений и примеры кода будут рассмотрены подробнее в главе 8.
Все приложения на основе CE состоят из процесса и одного или нескольких потоков:
ОС обеспечивает функции и структуры API процесса и потока для выполнения таких операций, как создание и завершение процесса или потока, и извлечение информации о процессе и потоке. Имеется ряд методов синхронизации, включая критические разделы, взаимные исключения (мьютексы), события, и семафоры.
Многие API реализуются в динамически подключаемых библиотеках (DLL). Динамическое связывание позволяет модулю включать только ту информацию, которая нужна системе во время загрузки или во время выполнения для обнаружения кода функции экспортированной динамически подключаемой библиотеки (DLL). Динамическое связывание отличается от статического связывания, во время которого редактор связей копирует код функции библиотеки в каждый модуль, который ее вызывает.
Библиотека codedll.dll автоматически связывается с каждым приложением для предоставления поддержки для базовых API. Некоторым API будет требоваться соединение приложения с дополнительными библиотеками DLL. Проверьте оперативную справочную информацию о конкретном API, чтобы узнать, не требуются ли дополнительные DLL.
.NET Compact Framework обеспечивает поддержку для выполняющихся в CE приложений C# и Visual Basic.
Прикладные программы используют вызовы системного API для использования служб и средств ОС. Системный вызов является функцией, которая располагается в другом процессе, и о которой уведомляет NK.exe. Ядро затем вызывает подходящий серверный процесс для обработки системного вызова.
(рис 6.3) Системные вызовы CE 6.0
Как видно на рисунке 6.3, когда приложение CE 6.0 делает системный вызов API
Затем ядро CE
Наконец, требуемая служба
Каждый системный вызов вызывает исключение, которое перехватывается ядром. Когда процесс вызывает системный вызов, он обращается к функции оболочки для этого системного вызова, которая определена в Coredll.dll. Эта функция готовит параметры функции для ядра и вызывает программное исключение. Это исключение может быть неопределенным адресным исключением или ловушкой ЦП.
Ядро затем обрабатывает это исключение и определяет правильный процесс адресат для отправки запроса вызова функции, или какой файл .exe может выполнить запрос. Процесс, который владеет функцией, выполняет ее, используя те же самые значения стека и регистра, которые содержит исходный поток в вызывающем процессе. Так как вызов функции существует в другом процессе, существование этого процесса должно проверяться, чтобы успешно выполнить системный вызов.
Во время всего процесса поток режима пользователя является тем же самым потоком, который выполняется в пространстве процесса для системного файла .exe. Когда поток мигрирует, его права доступа изменяются, чтобы отразить процесс, в котором он действует.
Ядро, которое представлено модулем NK.exe (New Kernel), является основой операционной системы CE (ОС). Ядро предоставляет базовые функции ОС для любого устройства на основе CE. Эти функции включают управление процессами, потоками, и памятью. Ядро также предоставляет некоторые функции управления файлами. Службы ядра позволяют приложениям использовать эти базовые функции. Рисунок 6.4 показывает общую структуру, выделяя ядро в качестве канала для остальной части базовой ОС.
Используйте
Ядро CE использует страничную систему виртуальной памяти для управления и распределения памяти программ. Система виртуальной памяти предоставляет непрерывные блоки памяти страницами по 4096 байтов в областях по 64 Кбайтов, так чтобы приложениям не нужно было управлять реальным распределением памяти. Для требований памяти менее 64 Кбайтов приложение может использовать локальную кучу, предоставляемую всем приложениям CE, и создавать отдельные кучи. Ядро также распределяет память в стеке для каждого нового процесса или потока. Используйте функции памяти из ядра для распределения и освобождения виртуальной памяти, использования памяти в локальной куче, создания отдельных куч, и распределения памяти из стека. Код программы может использовать неиспользуемую память из статического блока данных, который выделяется для загрузки приложения. Процессы также могут использовать отображенные в память объекты для общего доступа к данным.
(рис 6.4) Архитектура ядра CE 6.0
В устройстве на основе CE память ROM используется для хранения всей операционной системы (ОС), а также приложений, которые поставляются вместе с ОС. Используется отображение виртуальной памяти для уменьшения фрагментации памяти и обеспечения защиты памяти.
Виртуальная память с замещением страниц по требованию в файле подкачки на жестком диске обычно не используется, в отличие от популярных настольных операционных систем.
Многие устройства не имеют жесткого диска, и это также требует больше энергии. Флэш-память имеет также ограниченное количество циклов записи, что делает ее плохим выбором для устройства файла подкачки.
Виртуальная память с замещением страниц по требованию, использующая файлы подкачки, может также оказывать отрицательное виляние на производительность в реальном времени самой ОС, особенно когда компьютеру не хватает физической памяти, и возникает избыточная перегрузка при обмене между RAM и дисковым файлом подкачки.
В CE, когда инициализируется процесс, ОС отображает следующие DLL и компоненты памяти:
Библиотеки DLL и разделы чтения/записи ROM DLL загружаются, начиная с вершины адресного пространства. Библиотеки DLL управляются загрузчиком, который загружает все DLL по одному и тому же адресу для каждого процесса. Стек, куча, и исполняемый файл (.exe) создаются и отображаются с нижней части адресного пространства. Нижние 64 Кбайта памяти всегда остаются свободными.
Для CE 6.0
Так как доступ к виртуальной памяти транслируется в аппаратный доступ через
Центральные процессоры ARM и x86 используют аппаратные таблицы страниц, так что содержимое виртуальной памяти доступно непосредственно оборудованию, в то время как другие ЦП используют программный буфер опережающей выборки при передачах (TLB) miss handler, где содержимое виртуальной памяти необходимо заполнить, чтобы TLB действовал.
Рисунок 6.5 показывает внутреннее отображение адресного пространства виртуальной памяти для процесса пользователя.
(рис 6.5) Отображение виртуальной памяти пространства пользователя
Проектные задачи управления виртуальной памятью в CE 6.0 включают:
(рис 6.6) Отображение виртуальной памяти пространства ядра
Рисунок 6.6 показывает внутреннее отображение адресного пространства виртуальной памяти. Таблица 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 | Библиотеки |
|
| ядро | 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 загружаются снизу вверх: |
| пользователь | 0x00010000 - 0x3FFFFFFF | 1 GB | ВП процесса выделяемая пользователем | Исполняемый код и данные. Виртуальное распределение ВП пользователя (кучи). Распределение ВП начинается над exe и растет вверх. |
| пользователь | 0x00000000 - 0x00010000 | 64 KB | зависимые от ЦП данные ядра пользователя | Данные ядра пользователя всегда разрешают пользователю только чтение. В зависимости от ЦП это может быть чтение/запись ядра (ARM), или только чтение ядра (все другие). |
Пользователи могут вызывать функции ВП только на той памяти, которую они распределили с помощью VirtualAlloc, они не могут выполнять операции ВП на ВП в пространстве пользователя, распределенном ядром, таком как стеки, отображенные в память представления файлов, и данные/код DLL.
Ядро может читать и писать в общую область кучи, а процессы пользователя могут только читать общую область кучи. Назначение этой области состоит в обеспечении более эффективной коммуникации системного сервера с процессами клиента. Однако так как все процессы могут читать информацию из общей кучи, не храните никакую секретную информацию (такую как пароль) в общей куче. Между областями всегда существует неотображенная область размером как минимум 64 Кбайтов для защиты областей охвата доступа.
(рис 6.7) Пример отображения в устройстве виртуальной памяти на физическую
Рисунок 6.7 является примером того, как адреса отображаются из пространства физической памяти в пространство виртуальной памяти. Этот конкретный пример показывает множество адресов, которые статически отображаются в ядро. Память, которая отображается статически всегда доступна, в то время как память, отображаемая динамически, будет загружаться постранично операционной системой по требованию. Страничная организация сохраняет ресурсы памяти, так как это ограничивает объем физической памяти, которая требуется для отображения используемых
Замещение страниц по требованию вызывает в ядре исключение для выполнения правильного отображения, чтобы позволить завершить конкретный доступ к памяти. Это исключение является прозрачным для приложений, но оно занимает время и требует, чтобы операционная система была в состоянии, когда она может обработать исключение.
Статически отображенные адреса требуются для обработки ситуаций, когда ошибочное исключение страницы будет вызывать сбой системы, например, обращения ядра, когда оно находится уже в обработчике исключений и во время низкоуровневой инициализации ядра. Вся память RAM/ROM в системе должна иметь статическое отображение, также как и любые размещения памяти, к которым может обращаться
Этот пример демонстрирует еще одно свойство архитектуры виртуальной памяти. Отметим, что физическая память отображается в два различных виртуальных адреса одновременно.
Два диапазона виртуальных адресов в этом примере различаются своим использованием системного кэша. Доступ к адресам виртуальной памяти, помеченным как кэшированные, будет, возможно, попадать в кэш и не будет фактически происходить к физической памяти. Обращения к памяти в области, помеченной как некэшированная будут обходить кэш и идти прямо к физической памяти. Кэшированные обращения выполняются быстрее, потому что имеется возможность попасть в более быструю кэш-память в ЦП. Регистры аппаратных устройств являются примером адреса памяти, который должен быть сделан некэшированным, так как чтение и запись в эти устройства всегда должны обращаться к физическому оборудованию; большинство других отображений виртуальных адресов будет помечено как кэшируемые.
Базовые службы операционной системы (ОС) состоят из ядра CE и других средств, обычных для всех разработок ОС CE. Базовые службы ОС обеспечивают низкоуровневые задачи, такие как управление процессом, потоком и памятью. Базовые драйверы устройств также являются частью базовых служб ОС CE.
Базовые службы ОС предоставляют приложениям доступ к ресурсам компьютера и средствам нижележащей ОС, таким как память, файловые системы, устройства, процессы, и потоки. Приложение, использует эти службы для управления и мониторинга ресурсов, которые ему нужны для выполнения своей работы. Приложения могут совместно с другими приложениями использовать код или информацию. Сетевые функции читают или записывают в коммуникационные порты, а также управляют рабочими режимами этих портов.
Приложения управляют специальными условиями во время выполнения. Например, они могут обрабатывать ошибки, записывать в журнал события, и обрабатывать исключения.
Приложения могут использовать также специальные функции для отладки кода и улучшения его производительности. Например, функции отладки обеспечивают пошаговое управление выполнением других процессов, а функции мониторинга производительности предоставляют подробную информацию о выполнении процесса.
CE поддерживает два вида файловых систем: файловые системы, которые управляются драйверами файловой системы, и зарегистрированные файловые системы.
Так как управляемые FSD файловые системы являются предпочтительным типом файловой системы, CE включает драйверы файловой системы (FSD - File System Drivers) для ряда файловых систем. Кроме того, разработчики встраиваемых систем могут создавать и регистрировать собственные файловые системы.
Независимо от типа памяти, все файловые системы доступны через
Драйверы зарегистрированной файловой системы включают Release-Directory File System (RELFSD), Object Store (RAM) File System, и ROM File System.
Хранилище объектов в Windows Embedded CE предоставляет постоянное хранилище для приложений и связанных с ними данных, даже когда основной источник питания недоступен, при условии, что имеется резервный источник питания. Одна или несколько микросхем памяти, которые обычно являются микросхемами энергонезависимой RAM, составляют физическое хранилище объектов.
Хотя файловые системы, базы данных и системный реестр совместно используют одну кучу памяти, они не обязательно располагаются физически в хранилище объектов. Они могут располагаться в ROM, на отдельно установленных системах, или на внешнем устройстве, таком как устройство флэш-памяти. Данные создаются и извлекаются согласно типу памяти, независимо от реального устройства хранения.
Операционная система использует хранилище объектов для выполнения следующих задач:
Файловая система и реестр будут рассмотрены более подробно. Таблица 6.2 описывает объекты файловых систем и каталога управления хранилищем, которые можно выбирать для ОС при использовании инструмента Platform Builder (Сборщик платформы) для генерации нового ядра.
| Имя объекта каталога | Описание |
|---|---|
| Compression | Интерфейс прикладного программирования (API), который сжимает данные в файловых системах RAM и ROM, а также тома баз данных. |
| API, который обеспечивает поддержку встроенной базы данных CEDB. | |
| Bit-based | Средство, которое помогает определить, какие изменения произошли в базе данных или файловой системе RAM на устройстве и поэтому должны реплицироваться на рабочем столе. Эта модель использует четыре бита на объект для репликации данных. |
| RAM and ROM File System | Драйвер файловой системы, способный читать данные из файловой системы ROM и файловой системы RAM в хранилище объектов. |
| ROM-only File System | Драйвер файловой системы, способный читать данные из файловой системы ROM. |
| Hive-based Registry | Система реестра, которая хранит данные в файлах, или ульях, которые могут храниться в любой файловой системе. |
| RAM-based Registry | Система, которая хранит все данные реестра в хранилище объектов. |
| Binary Rom Image File System | Объект каталога, который используется для загрузки части образа ОС из среды постоянного хранения в RAM для выполнения. Этот объект каталога использует вызов страниц по требованию для загрузки дополнительных модулей по мере необходимости. |
| CD/ |
Драйвер файловой системы, который поддерживает как |
| API, который предоставляет улучшенные функции баз данных, включая поддержку транзакций, доступ нескольких пользователей, несколько порядков сортировки, свойства ключей и базы данных. | |
| FAT File System | Драйвер файловой системы, который поддерживает файловую систему FAT (таблица размещения файлов). |
| Extended FAT File System | Драйвер файловой системы, который поддерживает файловую систему Extended FAT. |
| Partition Driver | Драйвер, который интерпретирует разбиения на устройстве хранения для Partition Manager. |
| Управляющая панель приложения, которая позволяет пользователю манипулировать устройствами хранения. | |
| Transaction-safe FAT File System (TFAT) | Безопасная для транзакций файловая система FAT, которая гарантирует, что таблица размещения файлов не повреждается во время энергетического цикла. |
| System Password | API, который предоставляет поддержку для аутентификации на устройстве для предотвращения неавторизованного доступа. |
| Release Directory File System | Функции, которые предоставляют поддержку для Release Directory File System |
| Silent FATFS UI | Создает файл Fatutil.dll для устройства без компонентов графического интерфейса пользователя (GUI). |
Внутренняя файловая система в целевом устройстве управляет доступом к RAM. Файловая система может также обеспечить хранение файлов в хранилище объектов, которое находится в RAM. Имеется два варианта внутренней файловой системы: файловая система RAM и ROM, и файловая система только ROM. Они обладают различными свойствами, и нужно будет выбрать правильный вариант для целевого устройства. Обе файловые системы предоставляют возможность подключения дополнительных внешних файловых систем, таких как FAT (таблица распределения файлов).
Файловая система RAM и ROM предоставляет хранение файлов в хранилище объектов, а также доступ к ROM. Хранилище объектов является корнем (root) файловой системы, и все данные ниже корня хранятся в хранилище объектов, с исключением для внешних файловых систем, которые подключаются как каталоги ниже корня. Данные в ROM доступны через каталог Windows. Файловая система RAM и ROM наиболее полезна на целевых устройствах, которые обеспечивают постоянное питание RAM, так как хранилище объектов будет потеряно, если RAM не обновляется.
Файловая система только в ROM не позволяет приложениям размещать файлы в хранилище объектов. Данные в ROM доступны через каталог Windows, а внешние файловые системы также подключаются как каталоги ниже корня. Кроме того, для файловой системы только в ROM имеется возможность выбрать, чтобы внешняя файловая система помещалась в корне файловой системы. Если файловая система подключается как корень, все данные ниже корневого каталога хранятся в этой файловой системе, за исключением других внешних файловых систем.
CE объединяет библиотеки интерфейса прикладного программирования (API) Win32, интерфейса пользователя (UI), и интерфейса графических устройств (GDI) в модуль графики, работы с окнами и подсистемы событий GWES (
GWES поддерживает все окна, диалоговые боксы, элементы управления, меню, и ресурсы, которые составляют интерфейс пользователя (UI) CE, который позволяет пользователям управлять приложениями. GWES предоставляет также пользователю информацию в форме растровых изображений, курсоров, текста и иконок.
Даже устройства на основе CE, которые не имеют графического UI, используют базовые функции GWES управления окнами и сообщениями и управления питанием.
Все приложения в CE состоят из процесса и одного или нескольких потоков:
Поток является независимой частью процесса и является базовой единицей, для которой ОС выделяет время процессора.
Для задания уровней приоритета CE использует функции CeSetThreadPriority и CeGetThreadPriority. Функция CeSetThreadPriority задает приоритет для указанного потока. Функция CeGetThreadPriority возвращает 0 (ноль) как самый высокий приоритет, и 255, как самый низкий приоритет.
Так как CE поддерживает вытесняющую мультизадачность, то это создает эффект одновременного выполнения процессом нескольких потоков. Когда процесс имеет более одного выполняющегося потока, ОС быстро переключается с одного потока на другой, так что кажется, что потоки выполняются одновременно.
Поток является траекторией выполнения в процессе. Каждый раз, когда ОС создает процесс, она создает, по крайней мере, один поток. Цель создания потока состоит в том, чтобы использовать как можно больше времени ЦП. Например, во многих приложениях полезно создавать отдельный поток для обработки заданий печати, так чтобы пользователь мог продолжать использовать приложение во время печати.
Каждый поток совместно использует все ресурсы процесса, включая его адресное пространство. Каждый поток имеет стек. Редактор связей задает размер стека для всех потоков, которые создаются в процессе ( /STACK ). Отдельный поток может иметь свой собственный размер стека, вызывая CreateThread и используя параметр STACK_SIZE_PARAM_IS_ A_RESERVATION.
Поток содержит также состояние регистров ЦП, называемое контекстом, и запись в списке выполнения системного планировщика.
Можно использовать функцию GetThreadContext для извлечения контекста определенного потока, и функцию SetThreadContext для задания контекста определенного потока.
Каждый поток в процессе действует независимо. Если вы не делаете потоки видимыми друг другу, они выполняются по отдельности и не знают о других потоках в процессе. Потоки, совместно использующие общих ресурсы, должны координировать свою работу, используя метод синхронизации.
Приложение начинается, когда планировщик системы передает одному из своих потоков управление выполнением. Планировщик системы определяет, какие потоки должны выполняться, и когда они должны выполняться. Потокам с более низким приоритетом может понадобиться подождать, пока потоки с более высоким приоритетом завершат свои задания.
Потоки могут быть в одном из следующих состояний:
Когда все потоки находятся в блокированном состоянии, CE переходит в режим ожидания, который останавливает выполнение инструкций ЦП и потребление энергии на высоких уровнях. Из режима ожидания можно переключиться в режим приостановленный, если отсутствует активность пользователя. Приостановленный режим может контролироваться OEM и приложениями. Для PeekMessage.
Планирование является важным вопросом в любой ОСРВ. Во время планирование ядро поддерживает список приоритетов каждого потока в операционной системе (ОС). Каждый процесс может содержать несколько потоков, и каждый поток является траекторией выполнения. Система планирования управляет порядком в котором эти различные траектории выполнения выстраиваются, и позволяет траекториям взаимодействовать друг с другом предсказуемым образом.
Когда в системе планирования происходят прерывания, планировщик принимает прерывания в учет и реорганизует потоки соответствующим образом. Разработчик приложения может создать миниатюрную индивидуальную систему планирования внутри потока, используя в этом потоке нити. Планировщик использует квант времени для принятия решений планирования.
(рис 6.8) Пример планирования потоков. Поток 1 имеет самый высокий приоритет и выполняется до завершения, потоки 2 и 3 имеют одинаковый приоритет и выполняются циклически по очереди
Как видно на рисунке 6.8, CE использует алгоритм квантования времени на основе приоритета для планирования выполнения потоков. Потоки с одинаковым приоритетом выполняются циклически по очереди: когда поток останавливает выполнение, выполняются все другие потоки с таким же приоритетом, прежде чем исходный поток сможет продолжить. Потоки с более низким приоритетом выполняются, только после того как все потоки с более высоким приоритетом закончатся или будут блокированы. Если выполняется поток, и разблокируется поток с более высоким приоритетом, то поток с более низким приоритетом немедленно приостанавливается и запускается поток с более высоким приоритетом.
Поток должен выполнятся в течение заданного интервала времени, называемого квантом.
Поток выполняется пока:
После того как поток использовал свой квант, и если какой-либо поток с тем же приоритетом готов к выполнению, текущий поток приостанавливается, и другой поток запускается на выполнение. Единственным исключением для этого будет ситуация, когда поток является потоком "выполняющимся до завершения", что означает, что квант потока равен 0. Потоки с квантом, заданным равным 0, никогда не прекращаются с истечением срока, и никогда не будут вытеснены потоками с таким же приоритетом.
В CE 6.0 по умолчанию используется квант времени 100 мс. Квант времени можно задавать между 1 и 100 мс. Планировщик выполняет задание с самым высоким приоритетом. Задачи с одинаковым приоритетом будут выполняться циклически друг за другом. Никакого алгоритма старения в планировщике не используется, поэтому возможна ситуация зависания (потоки или процессы с низким приоритетом, которые никогда не выполняются). Пользователям необходимо тщательно проектировать прикладные программы и благоразумно задавать уровни приоритетов, чтобы избежать зависания.
CE предлагает 256 уровней приоритета, при этом нулевой обладает наивысшим приоритетом, а 255 является самым низким приоритетом. Многие более высокие уровни приоритета (с 247 и до нуля) присваиваются приложениям реального времени, драйверам, и системным процессам.
Чтобы помешать случайному приложению снизить производительность системы, OEM может ограничить использование всех уровней приоритета между 247 и нулем только определенными OEM приложениями. Используйте CeSetThreadPriority и SetThreadPriority для задания потоку уровня приоритета. Используйте CeGetThreadPriority и GetThreadPriority для извлечения уровня приоритета потока. Система уровней приоритета имеет четыре диапазона, показанные в таблице 6.3.
| Диапазон | Описание |
|---|---|
| 0 - 96 | Зарезервировано для приложений реального времени, расположенных выше драйверов. |
| 97 - 152 | Используется драйверами устройства на базе CE по умолчанию |
| 153 - 247 | Зарезервировано для приложений реального времени, расположенных ниже драйверов. |
| 248 - 255 | Отображается в приоритеты не реального времени. |
Для мьютексов и критических разделов, чтобы исправить эту ситуацию и освободить поток с более высоким приоритетом с помощью наследования приоритета CE позволяет потоку с более низким приоритетом наследовать приоритет критически более важного потока и выполниться с более высоким приоритетом, пока он не освободит используемый им ресурс. Наследование приоритета не применяется к семафорам, которые не имеют связанного с ними определенного владельца.
Так как требуется неограниченный объем времени для освобождения инверсированного потока и это находится вне контроля ядра, то OEM теряет управление над планированием процесса. Чтобы гарантировать производительность реального времени, OEM должен гарантировать, что условие
(рис 6.9) Пример инверсии приоритета
Рассмотрим пример, показанный на рисунке 6.9, который показывает, как система без наследования приоритета могла бы привести к плохому планированию потоков.
Предположим, что приложение имеет три потока:
Поток 1 и поток 2 находятся в спящем режиме или блокированы в начале примера. Затем выполняется поток 3 и входит в критический раздел. В этот момент поток 2 начинает выполнение, вытесняя поток 3, так как поток 2 имеет более высокий приоритет. Поэтому поток 3 продолжает владеть критическим разделом.
Позже начинает выполнение поток 1, вытесняя поток 2. Поток 1 пытается войти в тот критический раздел, которым владеет поток 3, но так как им владеет другой поток, поток 1 блокируется, ожидая критический раздел.
В этом месте начнет выполняться поток 2, так как он имеет более высокий приоритет, чем поток 3, а поток 1 не выполняется. Поток 3 никогда не освободит критический раздел, который ожидает поток 1, так как поток 2 будет продолжать выполняться. Поэтому поток с самым высоким приоритетом в системе, поток 1, становится блокированным, ожидая выполнения потоков с более низкими приоритетами.
Чтобы разрешить проблему с потоками CE допускает наследование приоритета на глубину одного уровня. В предыдущем примере, когда поток 1 блокируется, так как он ждет завершения потока 3, CE повышает
После освобождения потоком 3 общего ресурса, CE восстанавливает исходный
Однако если поток 3 блокирован и ожидает, чтобы другой поток X освободил объект, CE не повышает
Производительность в реальном времени определяется для операционной системы CE следующим образом:
Система реального времени является множеством всех системных элементов, оборудования, операционной системы, и приложений, которые все должны удовлетворять системным требованиям. Операционная система реального времени (ОСРВ) является одним из элементов этой системы.
Приложение реального времени создается для управления системами с жесткими ограничениями по времени, такими как управление производственным процессом, высокоскоростными устройствами сбора данных, или телекоммуникационным коммутирующим оборудованием. Уникальной характеристикой приложения реального времени является то, что оно не только предоставляет правильный ответ, но отвечает в течение точно определенного периода времени. Ядро CE содержит функции, которые улучшают ее производительность как ОСРВ.
Следующий список показывает возможности ядра, которые поддерживает CE, как ОСРВ:
Ядро CE обеспечивает производительность реального времени за счет следующей конструкции ядра и драйверов:
Время ответа, показанное в таблице 6.4, было измерено и опубликовано для CE 5.0, а время для CE 6.0, как утверждается, будет таким же или немного лучше. Тестовая система включала следующие оборудование и программное обеспечение:
| Время ответа прерывания | старт |
старт |
|---|---|---|
| минимум | 1.2 µs | 31.7 µs |
| среднее значение | 3.3 µs | 67.2 µs |
| максимум | 13.3 µs | 103.0 µs |
Время в таблице 6.4 примерно в 10 раз быстрее, чем у Linux, согласно недавнему исследованию . Как видно на рисунке 6.10, эти времена цикла ответа на несколько порядков величины быстрее, чем можно обычно видеть у настольной ОС общего назначения Windows, и вполне укладывается в диапазон времени ответа строго определенную ОС реального времени.
(рис 6.10) Измерение производительности CE в реальном времени. Категории реального времени Слабо (Soft) и Строго (Hard) основываются на исследовании OMAC, а времена ОС определяются без каких-либо расширений сторонних поставщиков для ОС реального времени
В ОС, где несколько потоков выполняются параллельно, важно иметь возможность синхронизовать деятельность различных потоков. Вспомните, что любые процессы или потоки, которые совместно используют глобальные переменные или ресурсы, требуют использования методов синхронизации (т.е. должны удовлетворяться требования взаимного исключения в разделах критического кода, которые обращаются к глобальным переменным, ограниченного ожидания, и условия продвижения) или будет получена ошибка. CE предоставляет несколько объектов синхронизации, которые позволяют синхронизовать действия потока с действиями в другом потоке. Эти объекты включают критические разделы, мьютексы, события, и семафоры.
Критические разделы являются структурами данных, размещенные приложением (часто статически размещенные), которые инициализируются перед использованием. Это означает, что ОС фактически не владеет "экземпляром объекта", и он не может совместно использоваться процессами. Критические разделы являются крайне эффективными, когда код обычно не должен блокироваться. В этом случае нет перехода в ядро, поэтому вовлекаются незначительные реальные накладные расходы. Если он не должен блокироваться, то критический раздел фактически разрешается в эквивалент мьютекса, поэтому не является таким эффективным, если ожидается много блокировок. Профилирование кода с помощью Kernel
Мьютексы являются, как подразумевает название (
Состояние объекта семафора подает сигнал, когда его счетчик больше нуля, и не подает сигнал, когда его счетчик равен нулю. Параметр InitialCount функции CreateSemaphore() определяет начальное значение счетчика. Каждый раз, когда освобождается ожидающий поток в связи с сигналом о состоянии семафора, счетчик семафора уменьшается на единицу. Используйте функцию ReleaseSemaphore() для увеличения счетчика семафора на заданное значение. Счетчик никогда не может быть меньше нуля или больше значения, определенного параметром MaximumCount. Несколько процессов могут иметь указатели на один и тот же объект семафора, позволяя использовать объект для межпроцессной синхронизации. Для совместного использования объекта процесс может определить имя объекта семафора в вызове функции CreateSemaphore().
Объекты событий обычно используются для указания, что что-то произошло, в противоположность синхронизации доступа к общедоступному ресурсу. Начальное состояние объекта события определяется параметром InitialState. Используйте функцию SetEvent для задания состояния объекта события для сигнализации. Используйте функцию ResetEvent для сброса состояния объекта события в несигнализируемое. Когда сигнализируется состояние сброшенного вручную объекта события, оно остается сигнализирующим, пока не будет явно сброшено в несигнализируемое с помощью функции ResetEvent. Любое число ожидающих потоков, или потоков, которые в дальнейшем начинают операции ожидания для указанного объекта событий, могут освобождаться во время сигнализации состояния объекта. Когда сигнализируется состояние автоматически сброшенного объекта событий, он остается сигнализирующим, пока не будет освобожден одиночный ожидающий поток; система затем автоматически сбрасывает состояние в несигнализируемое. Если ожидающих потоков нет, то состояние объекта событий остается сигнализирующим. События могут быть также пульсирующими, что всегда будет сбрасывать объект событий снова в несигнализируемое состояние.
Состояние сброшенного вручную объекта событий, сигнализируемое функцией SetEvent,остается сигнализируемым, пока не будет явно задано как несигнализируемое состояние функцией ResetEvent. Все ожидающие потоки, или потоки, которые впоследствии начинают операции ожидания для указанного объекта событий, вызывая функции ожидания, будут освобождаться, пока сигнализируется состояние объекта. Состояние автоматически сбрасываемого объекта события, сигнализируемое функцией SetEvent, будет оставаться заданным, пока не будет освобожден одиночный ожидающий поток, когда он перейдет в несигнализируемый. Сбрасываемые вручную объекты событий, сигнализирующие функцией PulseEvent, освободят все ожидающие потоки и немедленно вернутся в несигнализирующее состояние. Автоматически сбрасываемый объект события, сигнализирующий функцией PulseEvent, освободит максимум один ожидающий поток, и немедленно переходит в несигнализирующий. Если ожидающих потоков нет, событие все равно перейдет в несигнализирующее, ничего не освобождая. Используйте функцию CloseHandle для закрытия указателя. Система закрывает указатель автоматически, когда процесс завершается. Объект события разрушается, когда будет закрыт его последний указатель.
Каждый тип объекта, такой как карта памяти, семафор, событие, очередь сообщений, мьютекс, и
Независимо от используемого метода синхронизации, поток синхронизирует себя с другим потоком, освобождая объект синхронизации, и входя затем в состояние ожидания. Объект синхронизации сообщает ОС, какое специальное событие должно произойти, прежде чем поток сможет возобновить выполнение.
Когда возникает событие, поток снова можно использовать при планировании времени ЦП. После планирования поток продолжает выполнение. Поток теперь синхронизовал свое выполнение с возникновением события.
Все процессы должны защищаться против случайного изменения данных. Однако иногда двум процессам может понадобиться коммуникация друг с другом. Один из методов, который позволяет процессам общаться, называется межпроцессной синхронизацией.
Так как несколько процессов могут иметь указатели на один и тот же объект события или мьютекс, эти объекты можно использовать для выполнения межпроцессной синхронизации. Процесс, который создает объект, может использовать указатель, возвращаемый функцией CreateEvent или CreateMutex. Другие процессы могут открывать указатель на объект, используя имя объекта в другом вызове функций CreateEvent или CreateMutex. Именованные объекты предоставляют процессам способ совместного использования указателей объектов. После того как процесс создает именованное событие или объект мьютекса, другие процессы могут использовать это имя для вызова соответствующей функции, CreateEvent или CreateMutex, чтобы открыть указатель на этот объект.
CE поддерживает для межпроцессной коммуникации модели общей памяти и передачи сообщений. Существует много ситуаций, где имеет место использование общей памяти. Наиболее распространенным является передача буфера между процессами пользователя, драйверами и серверами. Приложения пользователя также могут совместно использовать память. В CE функции CeRemoteHeapCreate и CeRemoteHeapTranslatePointer позволяют создавать кучу, которая доступна только ядру или серверу в режиме пользователя и клиенту, где сервер может выделять, освобождать, читать и писать, в то время как клиент может читать и писать, но не может исказить метаданные кучи. Отображенные в память файлы позволяют нескольким процессам общаться, используя объект файла в качестве нижележащей среды коммуникации. Файл может быть реальным или с поддержкой в памяти, а отображение обеспечивает доступ к данным с помощью обычных указателей. Операционная система заботится о том, чтобы все процессы видели одинаковые данные.
Для отображенных в память указателей в CE используйте функции CeOpenCallerBuffer, CeCloseCallerBuffer, CeAllocAsynchronousBuffer, и CeFreeAsynchronousBuffer. Используйте ReadProcessMemory вместе с WriteProcessMemory. Соедините парой указатель с идентификатором процесса и передавайте их вместе. Используйте функции VirtualAllocEx, VirtualCopyEx, и VirtualAllocCopyEx для задания альтернативных точек входа в память для процессов. Эти механизмы обычно реализуются драйверами или серверами процесса режима пользователя/ядра. CeOpenxxx/CeClosexxx на самом деле реализуются с помощью Read/WriteProcessMemory. Они являются вспомогательными функциями, используемыми обычно драйверами или серверами режима ядра/пользователя для доступа к буферу памяти клиентского процесса. Read/WriteProcessMemory могут использоваться любым процессом, но требуют указатель на
Очереди сообщений P2P позволяют процессам эффективно передавать сообщения. Это не настоящая реализация общей памяти, но имеет небольшие накладные расходы и полезна во многих сценариях. Ниже показаны предоставляемые в CE функции очереди сообщений.
CreateMsgQueue - Создает или открывает определенную пользователем очередь сообщений.OpenMsgQueue - Открывает указатель на существующую очередь сообщений.CloseMsgQueue - Закрывает ReadMsgQueue - Читает одно сообщение из очереди сообщений.WriteMsgQueue - Записывает одно сообщение из очереди сообщений.GetMsgQueueInfo - Возвращает информацию об очереди сообщений.Сообщение WM_COPYDATA посылается, когда приложение передает данные другому приложению. Сообщение WM_SYSCOPYDATA посылается, когда компонент системы передает данные другому компоненту системы.
Приложения реального времени используют прерывания для своевременного ответа на внешние события. Для этого CE разбивает обработку прерывания на два шага: процедуру обработки прерывания (
Когда прерывания разрешены и происходит прерывание, ядро вызывает зарегистрированную
Обработчик исключительных ситуаций является основной целью всех прерываний. Когда происходит прерывание, микропроцессор передает управление обработчику исключительных ситуаций в ядре. Обработчик исключений затем вызывает
Обслуживание IRQ в Windows Embedded CE 6.0 начинается с ядра, которое перехватывает все исключения, а затем определяет соответствующее действие. В случае IRQ ядро перехватывает IRQ, сохраняет регистры, поддерживаемые для
Процедура обработки прерывания (
Поток обслуживания прерывания (
После обработки прерывания
(рис 6.11) Обработка прерывания в CE с помощью процедуры ISR и потока IST
Рисунок 6.11 показывает действия, вовлеченные в обработку прерывания в CE:
SYSINTR_xxx ) или SYSINTR_NOP. SYSINTR во внутренней таблице и находит событие, связанное с этим ID. Он задает это событие, чтобы планировщик мог спланировать и выполнить его.WaitForSingleObject() на событии прерывания и обрабатывает прерывание. Он должен минимально очистить или отключить прерывание на устройстве, а затем вызвать InterruptDone() перед дальнейшей обработкой.InterruptDone() восстанавливает IRQ на контроллере прерываний, чтобы происходили другие прерывания. Именно поэтому она должна вызываться как можно скорее, так как другие устройства, совместно использующие прерывание, блокируются.Одним из наиболее важных аспектов производительности ядра в реальном времени является возможность обслуживать IRQ в течение строго определенного периода времени.
Задержка прерывания относится, прежде всего, к задержкам программной обработки прерываний; то есть, количеству времени, которое проходит с момента, когда внешнее прерывание приходит в процессор и до момента, когда начинается обработка прерывания. Если подкачка страниц не происходит, время задержки прерываний в CE ограничено для потоков, заблокированных в памяти. Это делает возможным тестировать задержки худшего случая - общее время до запуска
Задержка для
Чтобы предотвратить потерю и задержку высокоприоритетных прерываний, ядро CE использует вложенные прерывания. Вложенные прерывания позволяют запросам прерываний (IRQ) с более высоким приоритетом вытеснять IRQ с более низким приоритетом. Вложенные прерывания допускаются в соединении с Real-Time Priority System (Система приоритетов реального времени).
Процедура
Драйвер устройства является программой, которая абстрагирует функции физического или виртуального устройства. Драйвер устройства управляет работой этих устройств. Примерами физических устройств являются сетевые адаптеры, таймеры, и универсальные асинхронные приемо-передатчики (CEDDK для низкоуровневых операций в драйверах устройств.
Многие драйверы устройств CE реализуют потоковый интерфейс. Точками входа базового потокового интерфейса являются XXX_Open, XXX_Close, XXX_Read, и XXX_Write. Сетевые адаптеры, адаптеры дисплея, устройства мыши, клавиатуры, и другие устройства специального назначения не используют потоковый интерфейс. Эти устройства используют интерфейс, который соответствует функциям устройства. Различные процессы будут загружать различные драйверы устройств. Хотя драйверы устройств CE являются привилегированными модулями, они не должны выполняться в режиме ядра.
Большинство драйверов устройств CE состоят из зависимого от платформы драйвера (
MDD имеет следующие характеристики:
Следующий список содержит вопросы для рассмотрения при выборе между реализацией многоуровневого драйвера или монолитного драйвера:
В CE 6.0 предоставляются образцы исходного кода для ряда драйверов и предоставляется широкий ассортимент обычно используемых драйверов устройств. Более подробная информация о разработке драйверов устройств будет представлена в лекции 9.
Менеджер устройств загружает все драйверы в пространство ядра как драйверы режима ядра, если только в реестре не задан флаг DEVFLAGS_LOAD_AS_USERPROC. Драйверы режима ядра предоставляют лучшую производительность, так как они могут вызывать API ядра непосредственно используя версию ядра coredll, называемую k.coredll.dll. Драйверы ядра могут синхронно обращаться к буферам пользователя очень быстро, так как память пользователя доступно непосредственно. Драйверы режима ядра должны быть надежными, так как они имеют неограниченный доступ к памяти. Ошибка в драйвере режима ядра может испортить память ядра, вызывая отказ системы.
Назначение Инфраструктуры драйвера (устройства) режима пользователя состоит в том, чтобы позволить загрузить промежуточный драйвер в режиме пользователя. Драйвер режима пользователя не сможет обратиться к оборудованию непосредственно. Для некоторых драйверов этот метод взаимодействия будет увеличивать стабильность системы. Отображение виртуальной памяти используется для защиты ядра от программ режима пользователя. Защита памяти ядра обеспечивается тем, что драйвер выполняется в режиме пользователя.
Инфраструктура драйвера режима пользователя делится на два физических компонента. Первым компонентом является Рефлектор драйвера режима пользователя (
Когда драйвер отмечен в реестре как драйвер режима пользователя, менеджер устройства будет обращаться к Рефлектору драйвера режима пользователя. Рефлектор драйвера режима пользователя запускает соответствующий процесс Хоста драйвера режима пользователя и пересылает в него запросы В/В. Процесс Хоста драйвера режима пользователя в свою очередь пересылает запросы В/В в Драйвер режима пользователя.
(рис 6.12) Архитектура драйвера режима пользователя
Процесс использования Драйвера режима пользователя начинаются с приложения пользователя или с драйвера шины предка. Приложения пользователей и драйверы шины предка могут загружать Драйверы режима пользователя, вызывая функции ActivateDevice или ActivateDeviceEx. Приложения пользователя и драйверы шины предка могут выгрузить Драйверы режима пользователя, вызывая функцию DeactivateDevice. После загрузки любое приложение пользователя или драйвер могут обратиться к Драйверу режима пользователя, вызывая указатель устройства.
Если драйвер является Драйвером режима пользователя, обращение к ActivateDevice или ActivateDeviceEx приведет к тому, что менеджер устройств вызовет также функцию Рефлектора драйвера режима пользователя. Драйвер распознается как Драйвер режима пользователя, когда значение FLAGS задано как DEVFLAGS_LOAD_ AS_USERPROC (0x10) в ключе устройства в реестре.
Рефлектор драйвера режима пользователя, который знает об исходном процессе и процессе места назначения, использует CeFsIoControl для пересылки запроса менеджера устройства Хосту драйвера режима пользователя. Хост драйвера режима пользователя затем анализирует запрос, чтобы загрузить, выгрузить, или вызвать точку входа драйвера шины предка.
Драйвер режима пользователя имеет ограниченные права доступа к оборудованию, что не позволяет ему размешать такие запросы, как отображение физической памяти или вызов функций прерываний.
Чтобы выполнить запросы такого типа, Драйвер режима пользователя вызывает Рефлектор драйвера режима пользователя, и активирует Рефлектор драйвера режима пользователя для обработки запроса. Рефлектор драйвера режима пользователя затем проверяет запрос пользователя согласно настройкам реестра, чтобы определить, должен ли он выполнить запрошенное действие. В отличие от прерываний и отображения физических адресов Драйвер режима пользователя может, через указатель устройства и без помощи Рефлектора драйвера режима пользователя, обратиться к драйверу шины предка, независимо от того, где находится драйвер шины предка.
Реестр является системной базой данных, которая хранит информацию конфигурации для приложений, драйверов, и операционной системы. Для прикладных программ реестр наиболее часто используется для хранения информации состояния между вызовами. Например, приложение может иметь окна, которые пользователь может перемещать и изменять в размере. Перед выходом приложение может сохранить в реестре свою информацию об окнах. Затем, когда приложение запускается снова, оно может извлечь информацию и разместить соответственно его окна. ОС использует также информацию в реестре для поиска и загрузки драйверов устройств, когда появляется новое устройство с горячим подключением. Приложения пользователей, написанные для выполнения на нескольких устройствах, могут запрашивать реестр для определения, какое оборудование присутствует на устройстве.
Структура реестра CE аналогична реестру настольных версий Windows. Реестр содержит множество поддеревьев данных. Каждое поддерево состоит из ветвей, называемых ключами, и каждый ключ может содержать подключи и/или записи. Записи хранятся как пары имя/значения. В основании каждого поддерева находится корень, который определяется с помощью хорошо-известного константного значения, или HKEY.
Таблица 6.5 показывает корневые константы, поддерживаемые в CE, и краткое описание каждой:
| Корневая ключевая константа | Описание |
|---|---|
HKEY_CLASSES_ROOT |
Хранит соответствие типов файлов и данные конфигурации OLE. |
HKEY_CURRENT_USER |
Хранит специфические данные пользователя, который зарегистрирован в системе в данный момент. Это корневые точки к соответствующему ключу из HKEY_USERS. Сделанные изменения автоматически делаются в ключе пользователя в HKEY_USERS. |
HKEY_LOCAL_MACHINE |
Хранит специфические для машины данные и конфигурационную информацию для драйверов устройств и приложений. |
HKEY_USERS |
Хранит данные для всех пользователей, включая пользователя по умолчанию. |
Базовый фрагмент данных, который хранится в реестре, называется значением. Значение может быть различного типа, включая строку или двоичное значение. Каждое значение имеет имя и соответствующий фрагмент данных. Например, устройство которое выполняет программное обеспечение CE HKEY_LOCAL_MACHINE\Software\Microsoft\Pocket Word\Settings для хранения целочисленного фрагмента данных для версии Pocket Word.
Большинство операций реестра использует функции реестра. Реестр CE экспортирует функции реестра Win32 для приложений для вызова для записи или для доступа к данным времени выполнения и других. Используйте реестр для хранения данных, которые требуются приложению для каждого сеанса. Например, можно сохранить состояние приложения во время процесса выключения. При запуске приложение может восстановить предыдущие настройки. Пространство реестра ограничено, поэтому пользователи должны минимизировать использование реестра их приложениями только несколькими ключами и упаковывать данные в битовые поля, если нужно минимизировать число требуемых ключей.
CE поддерживает два типа реестров, на основе RAM и на основе улья (hive). По умолчанию CE 6.0 реализует реестр на основе улья. Тип реестра невидим для приложений, но изменяет сохраняемость, последовательность загрузки, скорость, и использование памяти на используемом устройстве. Выбор типа реестра и настроек реестра влияет также на поведение профилей пользователей. Предоставляется специальная утилита, называемая Regedit, для редактирования реестра в Platform Builder. Platform Builder генерирует начальные записи реестра для используемого устройства вместе с кодом образа ОС.
Поддержка профиля пользователя имеется во всех конфигурациях файловой системы. Никакие компоненты для использования профилей пользователей добавлять не требуется.
Реестр на основе RAM хранит все данные реестра в хранилище объектов. Это эффективно в терминах скорости и размера в устройствах, которые имеют RAM с питанием от батареи. Устройства, которые не поддерживают питание RAM во время выключения, должны копировать реестр во время выключения и восстанавливать реестр при включении питания. Реестр на основе RAM предназначен для использования в устройствах, которые часто используют теплую загрузку, но редко или никогда холодную загрузку.
Реестр на основе улья хранит данные реестра в файлах, или ульях, которые могут храниться в любой файловой системе. Это исключает необходимость выполнения резервного копирования и восстановления при выключении питания. Исключение этой работы во время загрузки и выключения питания делает процесс холодной загрузки быстрее.
Каждый файл или улей содержит совокупность данных реестра. Реестр на основе улья делится на два улья: системный улей, который содержит все системные данные, и улей пользователя, который содержит все данные, имеющие отношение к одному определенному пользователю. Многопользовательские системы будут содержать несколько ульев пользователей. Улей пользователя будет присоединяться при регистрации в системе и отсоединяться при выходе.
Регистр на основе улья предназначен для использования на устройствах, которые часто используют холодную загрузку, но редко или никогда теплую. Он также полезен на устройствах, которые требуют поддержку нескольких пользователей.
Улей является группой ключей, субключей, и значений в реестре, которые имеют множество поддерживающих файлов, содержащих резервные копии данных из улья. Улей интерпретируется как одна единица и сохраняется и восстанавливается как один файл.
Менеджер устройств (
Менеджер устройств отслеживает интерфейсы, предоставляемые драйверами, и поддерживает поиск драйверов на основе глобально уникального идентификатора (GUID). Интерфейс IClass может связать интерфейс GUID с унаследованным именем драйвера, его именем $device, или его именем $bus. Например, COM1:, $device\com1, или $bus\pci_0_3_0.
Менеджер устройств является процессом, который выполняется в операционной системе CE, отслеживая загруженные драйверы и их интерфейсы. Он выполняется постоянно и запускается из ядра. Менеджер устройств может уведомлять пользователя, когда интерфейсы устройств становятся доступны и недоступны. Пользователь или сама система может делать интерфейсы устройств доступными или недоступными. Кроме того, Менеджер устройств уведомляет ядро, что интерфейс устройства поддерживает файловые операции, такие как
CreateFile для доступа к устройствам, которые предоставляет потоковый интерфейс. Менеджер устройств посылает обратные вызовы уведомления о питании драйверам устройств и предоставляет службы управления питанием.
Менеджер устройств управляет ключом Active в реестре. Только Менеджер устройств должен обращаться к ключу Active для доступа по чтению или записи. Можно неявно обратиться к ключу Active через параметр функции инициализации драйвера устройства.
Менеджер устройств ищет ключ реестра HKEY_LOCAL_MACHINE\Drivers\RootKey, чтобы определить ключ для начала обработки загрузки драйвера. Значением по умолчанию для RootKey является Drivers, но оно обычно задается как Drivers\BuiltIn. Менеджер устройств вызывает ActivateDeviceEx для загрузки драйвера, определенного значением подключа Dll, находящегося в ключе, определенном значением RootKey.
Значение подключа Dll по умолчанию будет BusEnum.dll, называемое также перечислителем шины. Загрузка BusEnum.dll вызывает загрузку всех драйверов устройств. Устройство, загруженное функцией ActivateDeviceEx, может прочитать его указатель активации из его ключа реестра Active.
Менеджер устройства связывает имя шины с драйверами. Неименованные устройства также могут иметь имя шины, так как даже если приложения могут не иметь доступа к драйверу, драйвер может быть доступен другим драйверам или системным объектам, таким как Менеджер питания. Имя шины может иметь ACL отличный от обычного имени устройства.
Драйверы могут программным путем объявлять интерфейсы, вызывая DMAdvertiseInterface. Функция DMAdvertiseInterface позволяет драйверам добавить дополнительные GUID для поиска в их соответствующих списках. DMAdvertiseInterface предоставляет библиотека Devmgr.dll, которая также реализует большую часть функций Менеджера устройств. Так как только Менеджер устройств может загрузить Devmgr.dll, только драйверы устройств могут вызывать DMAdvertiseInterface. Если драйвер устройства не объявляет о недоступности своих интерфейсов, когда драйвер выгружается, Менеджер устройств автоматически очищает уведомление объявления интерфейса.
Менеджер устройств состоит из Device.exe и Devmgr.dll. Device.exe содержит библиотеку Devmgr.dll, которая реализует базовые функции Менеджера устройств. Так как Менеджер устройств состоит из двух отдельных модулей, драйверы устройств могут соединяться непосредственно с Менеджером устройств и вызывать определенные функции, такие как DMAdvertiseInterface, не создавая накладных расходов системного вызова. Таблица 6.6 показывает компоненты Менеджера устройств.
| Компонент | Описание |
|---|---|
devcore |
Предоставляет базовые функции Менеджера устройств. |
iorm |
Предоставляет функции менеджера ресурсов В/В. Iorm является требуемым компонентом и не может быть уделен. |
pmif nopmif Pmif |
Предоставляет интерфейс к точкам входа DLL Менеджера питания. Nopmif предоставляет версию с заглушками точек входа Менеджера питания. |
Драйвер устройства является программой, которая абстрагирует функции физического или виртуального устройства. Драйвер устройства управляет работой этих устройств. Различные процессы загружают различные драйверы. Таблица 6.7 показывает процессы, которые загружают драйверы, и какие драйверы загружает каждый процесс.
| Процесс | Драйверы |
|---|---|
| File System (FileSys.dll) | FileSys.dll загружает драйверы файловой системы. Дополнительная информация в разделе по файловым системам. |
| Device.exe загружает аудио драйверы, драйверы батареи, драйверы клавиатуры, драйверы мыши, драйверы |
|
| GWES.dll загружает драйвер устройства, если GWES является единственным клиентом драйвера. Драйверы устройств, загруженные GWES, представляют стандартное множество функций для всех аналогичных устройств. Драйверы, которые загружает GWES, могут представлять потоковый интерфейс, или они могут представлять другие интерфейсы. Наличие альтернативных вариантов делает доступ к драйверам значительно быстрее. GWES загружает драйверы дисплея, драйверы принтера, и драйверы сенсорного экрана. |
Когда система загружается, перечислитель шины перечисляет рееестр и загружает все встроенные устройства, на основе этой информации из реестра. Можно сконфигурировать эту информацию реестра. Менеджер ресурсов В/В затем отслеживает текущее состояние доступных в системе ресурсов, и управляет всеми дальнейшими запросами и распределениями ресурсов В/В драйверов шины. Следовательно, все драйверы шины должны запрашивать ресурсы В/В у менеджера ресурсов В/В, когда они загружают драйвер клиента для устанавливаемых устройств или других типов устройств.
Менеджер ресурсов В/В является неотъемлемой частью Менеджера устройств. Менеджер ресурсов В/В отслеживает доступные системные ресурсы, инициализированные из реестра перед загрузкой каких-либо устройств. Отслеживание этих ресурсов предотвращает случайные коллизии, когда два или несколько драйверов попытаются использовать одни и те же ресурсы.
OAL и реестр обычно предварительно распределяют ресурсы пространства В/В и IRQ, которые запрашивают драйверы шины. Однако Менеджер ресурсов В/В не ограничен управлением пространствами В/В и IRQ. Определенное множество доступных ресурсов может включать все, что вы определяете. Драйверы шины, такие как драйвер шины PCI, ресурсы запроса пространства В/В и IRQ у Менеджера ресурсов В/В, когда он загружает драйверы устройств для устройств, которые находит. То же самое справедливо для драйвера шины
Каждая аппаратная платформа имеет уникальные IRQ и доступное пространство В/В. IRQ для встроенных и фиксированных устройств должны отображаться в идентификаторы прерываний ( SYSINTR ) в OAL. IRQ для встроенных и фиксированных устройств должны исключаться из доступных ресурсов. IRQ используемые с шиной PCI обычно являются совместно используемыми.
IRQ и ресурсы пространства В/В являются предопределенными. Ключи реестра HKEY_LOCAL_MACHINE\Drivers\Resources\IRQ и ключи реестра HKEY_LOCAL_MACHINE\Drivers\Resources\IO предоставляют начальное состояние Менеджера ресурсов В/В.
Загрузчик CE отвечает за загрузку модулей, которые состоят, как из исполнимых файлов, так и динамически подключаемых библиотек (DLL), в виртуальную память, так что они могут выполняться операционной системой. Каждый модуль может иметь несколько связанных с ним флагов в конфигурационном файле Config.
Для каждого модуля можно задать следующие свойства:
Загрузчик обрабатывает также несколько выполняемых на месте (
Встраиваемые устройства часто работают от батарей, и даже устройства работающие от источника переменного тока необходимо проектировать с учетом эффективного потребления энергии.
Длительная работа от батареи является одним из основных конструкционных рассмотрений в таких устройствах, как сотовые телефоны. Большинство операционных систем включают поддержку для управления питанием, отключая части оборудования и возможно замедляя частоту работы процессора во время периодов неактивности. Следующая иллюстрация показывает состояния питания и переходы в CE 6.0.
(рис 6.13) Состояния питания и переходы CE 6.0
Менеджер питания позволяет управлять устройствами просто и независимо от базовой модели управления питанием в CE. В базовой модели питания CE устройства получают уведомления, что ОС приостанавливает и возобновляет работу. Это уведомление происходит в контексте прерывания, поэтому устройства строго ограничены в отношении того, что они могут делать во время приостановленного состояния, и как долго они могут это делать. Рисунок 6.13 показывает архитектуру управления питанием для CE.
Таблица 6.7 описывает переходы между состояниями для CE - в зависимости от используемого устройства.
| Переход | Описание |
|---|---|
Power-on reset |
Используемое устройство очищает рабочую RAM и инициализирует файловую систему. |
|
Первое применение питания, например, когда устанавливается резервная батарея. |
|
Переход из состояния питания On. Теплая загрузка очищает рабочую RAM. |
On-to-Idle |
Переход из полностью выполняющегося состояния в состояние, в котором микропроцессор использует мало энергии. |
Idle-to-On |
Переход микропроцессора из маломощной к работе в полную мощность. |
On-to-Suspend |
Переход к остановке микропроцессора в результате определенных событий. Вызывается функция XXX_PowerDown драйвера устройства. |
Suspend-to-On |
Переход остановленного микропроцессора к работе в полную мощность на основе определенных пробуждающих событий. Вызывается функция XXX_PowerUp драйвера устройства. |
On-to-Critical off |
Переход, когда обнаруживается критически низкое напряжение питания. Для устройства необходимо реализовать функцию перехода в состояние Critical Off. |
(рис 6.14) Архитектура Менеджера питания CE 6.0
Используя Менеджер питания устройства получают уведомления об изменении состояния питания как управляющие коды В/В (IOCTL). Так как IOCTL выполняются в контексте потока, разработчики драйвера имеют значительно большую гибкость в том, как они реализуют изменение состояния питания. Использование IOCTL для управления питанием позволяет также разделить состояние питания устройства и общее состояние питания ОС. Поэтому некоторые устройства можно выключить во время работы ОС, а другие можно оставить включенными, когда большая часть ОС приостановлена.
Кроме управления питанием устройства Менеджер питания уведомляет приложения о связанных с питанием событиях. Например, Менеджер питания информирует заинтересованные приложения, когда ОС восстанавливается из приостановленного состояния.
Менеджер питания реализован как динамически подключаемая библиотека (DLL), называемая Pm.dll, которая компонуется непосредственно с Device.exe. Device.exe вызывает точки входа в Pm.dll, когда вызываются
Менеджер питания действует как посредник между устройствами, приложениями, и определяет состояния питания ОС. Он реализует следующее множество правил коммуникации между тремя этими частями:
Если минимальная граница потребления энергии задана выше, чем максимальная, питание устройства будет оставаться повышенным, пока устройство требуется приложению.
Устройства могут реализовать один или несколько состояний питания устройства. Количество состояний питания устройства ограничено. Если ОС переходит в приостановленное состояние, наложенные приложением минимальные ограничения на питание будут задаваться отдельно, пока ОС находится в приостановленном состоянии.
Состояния питания системы описывают для всех устройств максимальное состояние питания устройства. Системные состояния питания определяются OEM, описываются в реестре, и могут дополнительно иметь код для их поддержки в Менеджере питания. OEM может определить любое число системных состояний питания.
В инфраструктуре Менеджера питания OEM определяет состояния питания ОС, которые устанавливают максимальные состояния питания устройства. Устройства вызывают функцию DevicePowerNotify для регулировки своих собственных уровней питания, а приложения вызывают функцию SetPowerRequirement для проверки, что требуемые им устройства выполняются на приемлемом уровне производительности.
Менеджер питания управляет питанием устройств и улучшает общую эффективность питания операционной системы, обеспечивает управление питанием для каждого устройства, и сосуществуют с приложениями и драйверами, которые не поддерживают Менеджер питания. Можно использовать управление питанием для уменьшения потребления питания используемого устройства и для поддержки и сохранения файловой системы в RAM во время состояний питания on, idle, и suspend.
Менеджер питания предоставляет также следующие возможности:
Менеджер питания ожидает, что все управляемые устройства поддерживают одно или несколько состояний питания устройства. Существует ограниченное число состояний питания устройства, и устройство должно информировать Менеджер питания о своих характеристиках потребления энергии. Состояния питания устройства обычно обеспечивают производительность за счет дополнительного потребления энергии.
Менеджер питания управляет состояниями питания устройства в контексте состояний питания системы, которые определены OEM.
Состояния питания системы описываются в реестре, где можно определить любое число состояний. Состояния питания системы определяют верхнюю границу для состояний питания устройства.
Некоторые приложения могут требовать, чтобы заданное устройство обслуживалось на определенном уровне питания устройства. Например, приложение потокового аудио может требовать, чтобы его сетевая карта и аудио-кодек оставались с высоким уровнем питания во время воспроизведения музыки. Приложение потокового видео может нуждаться в сети и аудио, плюс оно может требовать, чтобы дисплей не переходил в режим хранителя экрана, и возможно, поддерживать включенной подсветку. Приложения могут требовать, чтобы Менеджер питания задавал требования минимального состояния питания устройства, используя функции API SetPowerRequirement и ReleasePowerRequirement.
Службы безопасности являются существенной частью любой современной операционной системы. Службы коммуникации, приложения пользователей, файловые системы и хранилища данных, и службы Интернет все требуют защиты секретной информации. CE предоставляет набор инструментов для улучшения безопасности устройства. Однако пользователь отвечает за тщательный анализ безопасности устройства и выбор компонентов ОС, подходящих для устройства. При добавлении каждого нового свойства, разработчики должны тщательно рассматривать последствия для безопасности.
Доступны следующие технологии обеспечения улучшенной безопасности в устройствах и приложения:
(рис 6.15) Архитектура системы безопасности CE
Сетевые свойства и поддержка сети являются критически важным компонентом любой современной операционной системы. CE предоставляет ряд сетевых служб и свойств. CE предоставляет поддержку для приложений на основе Интернет. Поддерживаются следующие сетевые свойства:
Операционная система CE реализует пакет протоколов TCP/IP (Transmission Control Protocol/Internet Protocol). ОС включает стандартный стек TCP/IP, позволяющий устройствам на основе CE участвовать как одноранговые узлы сети и серверы в локальных (LAN) и удаленных сетях.
CE поддерживает следующие стандартные характеристики:
и имеет также следующие усовершенствования производительности:
Поддержка предоставляется, как для IPv4, так и для IPv6. Таблица 6.8 суммирует предоставляемые службы TCP/IP.
Архитектура пакета протоколов CE TCP/IP показана на рисунке 6.16.
(рис 6.16) Архитектура сети TCP/IP CE
| Служба | Описание |
|---|---|
| Клиент Dynamic Host Configuration Protocol (DHCP) | Клиентам DHCP динамически присваиваются различные конфигурационные параметры, такие как IP-адрес, маска подсети, используемый по умолчанию шлюз, и другие критические данные сетевой конфигурации. |
| Windows Internet Name Service (WINS) | WINS является клиентом имен NetBIOS, который управляет процессом разрешения имен, поддерживая актуальный список имен компьютеров NetBIOS и соответствующие IP-адреса. |
| Клиент Domain Name System (DNS) | CE не поддерживает размещение сервера DNS. Однако CE запрашивает сервер DNS для разрешения имен, если такой сервер существует в сети. |
| Extended DNS Querying and Update | Эта служба предоставляет протокол |
| Поддержка коммутируемого доступа (PPP/SLIP) | CE реализует коммутируемый доступ к сети с помощью |
| Печать в сети TCP/IP | ВCE TCP/IP поддерживает сетевую печать через протокол Server Message Block (SMB). Он не предоставляет Windows Line Printer Remote (LPR) |
| Агент расширения Simple Network Management Protocol (SNMP) | Агент расширения SNMP предоставляет субагента MIB-2, который позволяет управлять и контролировать состоянием TCP/IP. |
| Поддержка глобальной сети (WAN) | Эта служба предоставляет пользователям доступ в Интернет. |
| Утилиты связи TCP/IP | Базовые утилиты связи TCP/IP, включая серверы File Transfer Protocol (FTP) и telnet. Сервер telnet позволяет осуществлять удаленное администрирование через стандартного клиента telnet. Образец сервера FTP используется для копирования файлов на и с удаленных компьютерных систем через сеть с помощью TCP/IP. |
| Network Utilities | Многие инструменты разрешения сетевых проблем доступны для CE, например, ipconfig, iPv6, ipv6tun, netstat, ping route, и tracert. |
| Internet Protocol Helper (IP Helper) | IP Helper предоставляет интерфейсы прикладного программирования (API), которые помогают в сетевом администрировании локального компьютера. |
| Удаленный вызов процедуры (RPC) | Удаленный вызов процедуры Microsoft (RPC) используется для создания распределенных клиент/серверных программ. Стабы и библиотеки RPC управляют большинством процессов, связанных с сетевыми протоколами и коммуникацией. Это позволяет сосредоточиться на деталях приложения, а не на деталях сети. |
| Службы Windows HTTP (WinHTTP) | WinHTTP предоставляет разработчикам поддерживаемый сервером, высокоуровневый интерфейс с протоколом Интернет HTTP/1.1. |
| Windows Internet (WinInet) | WinInet управляет всей коммуникацией между приложением Winsock. |
| Windows Sockets (Winsock) | Приложения обращаются к стеку TCP/IP через интерфейс Winsock. |
В CE используется специальный инструмент для генерации индивидуального ядра операционной системы, называемый Platform Builder, который показан на рисунке 6.17. В CE 6.0 он выполняется в Visual Studio 2005 с SP1. В Platform Builder разработчик выбирает различные свойства ОС и необходимые драйверы устройств из объектов каталога (слева на рисунке 6.17), используя мышь для выбора необходимых объектов. Затем пользователь выбирает Build из меню верхнего уровня для сборки нового ядра ОС, используя выбранные свойства ОС. Новую ОС можно затем выполнить и отладить на эмуляторе ARM или можно быстро загрузить в требуемое устройство, соединенное с ПК с помощью сети, USB, или последовательных соединений.
(рис 6.17) Platform Builder является инструментом сборки нового образа ядра ОС
Существует большое число уникальных терминов, используемых в Platform Builder. Использование Platform Builder и различных меню будет легче, когда вы поймете следующую терминологию:
Объект каталога: Любой объект, который можно выбрать из Catalog Items View.
Шаблон конструкции: Предопределенная выборка компонентов операционной системы, которую предоставляет Microsoft для некоторой категории базовых целевых устройств. Для большинства проектов шаблон конструкции является просто быстрой начальной стартовой точкой. При сохранении или модификации шаблон конструкции становится начальным проектом ОС.
Конструкция ОС: Выборка объектов каталога, которые определяют характеристики ОС. Можно начать проект ОС с шаблона конструкции или без шаблона.
Образ времени выполнения: Программное обеспечение для развертывания на целевом устройстве, или то же самое программное обеспечение, выполняющееся на целевом устройстве. Образ времени выполнения содержит ОС и связанное с ней программное обеспечение.
Пакет поддержки платы (BSP): Программное обеспечение, которое является специфическим для аппаратной платы. Это программное обеспечение обычно включает начальный загрузчик, уровень адаптации OEM (OAL), и специфические для платы драйверы устройств.
Каталог: Контейнер выбираемых индивидуально объектов функций CE.
Компонент: Наименьшая единица функциональности, которую можно добавить в конструкцию ОС.
Конфигурация: Выборка объектов каталога и выборка определенных возможностей.
Аппаратная платформа: Архитектура оборудования для выполнения ОС CE и связанного оборудования.
Модуль: EXE или DLL, которые являются частью ОС CE.
Подпроект: Механизм отслеживания совокупности файлов, которые можно использовать для проектирования и добавления функций в ОС CE. Проекты ОС могут содержать несколько подпроектов.
Целевое устройство, устройство на основе CE: Экземпляр аппаратной архитектуры или экземпляр объединенной аппаратной и программной архитектуры.
Проект: Контейнер для всех файлов, связанных с конструкцией ОС.
Для сборки образа времени выполнения необходимо сначала создать конструкцию операционной системы, которая определяет функции, которые должен поддерживать образ времени выполнения. Имеется несколько шаблонов конструкции для различных классов устройств для использования в качестве быстрой начальной точки для новой конструкции ОС. Конструкцию ОС можно начать, выбирая шаблон конструкции, или без шаблона конструкции. Конструкция ОС соответствует множеству переменных окружения в рабочей среде сборки для Platform Builder.
(рис 6.18) Последовательность разработки нового образа ОС времени выполнения
С каждой конструкцией ОС Platform Builder по умолчанию предоставляет конфигурацию с именем Debug и конфигурацию с именем Release. Вы можете выбрать одну конфигурацию. Конфигурация определяет параметры сборки конструкции ОС. Можно модифицировать параметры сборки для каждой конфигурации. Для каждой конструкции ОС только одна конфигурация может быть активна в данный момент времени. Вариант Debug выводит больше
Затем разработчик собирает для устройства новый образ модифицированной ОС. В Platform Builder, когда вы выбираете сборку образа времени выполнения на основе конструкции операционной системы, система сборки, показанная на рисунке 6.19, выполняет следующие последовательные фазы:
(рис 6.19) Система сборки CE
Система сборки выполняет следующие задачи во время этих фаз:
Целевые устройства могут включать множество устройств, включая ARM
Пользователи новички должны использовать графический интерфейс пользователя Platform Builder для сборки системы. Опытные пользователи часто вызывают непосредственно систему сборки из командной строки, чтобы сохранить время и минимизировать время сборки. В раскрывающемся меню сборки верхнего уровня есть возможность открыть систему сборки в режиме командной строки. Повторная сборка сначала очищает все файлы, а затем запускает новую сборку.
Система сборки использует несколько типов конфигурационных файлов для сборки нового образа ОС. Эти файлы настраиваются автоматически, но при удобном случае можно сделать в этом файле изменения. Понимание основ системы сборки будет также полезно для понимания и исправления любых ошибок в сборках ОС. Конфигурационные файлы исходного кода содержат следующую информацию для инструмента Build (Build.exe):
На основе этой информации инструмент Build собирает исходный код в каталоге и указанных подкаталогах. Таблица 6.9 показывает типы конфигурационных файлов исходного кода
| Тип файла | Описание |
|---|---|
| Файл Dirs | Определяет дополнительные подкаталоги, которые содержат дополнительный исходный код. |
| Файл Makefile | Содержит переменные, необходимые для компиляции и компоновки исходного кода. |
| Файл Module-Definition | Содержит операторы, определяющие исполняемый код или динамически подключаемую библиотеку. |
| Файл Sources | Содержит макро-переменные, необходимые для сборки исходного кода. Он перечисляет подключаемые и библиотечные файлы, необходимые для |
Инструмент Build обходит дерево каталогов в поиске файлов dirs, а затем файлов sources. Файлы Dirs определяют файлы sources, которые содержат:
Когда инструмент Build находит файл sources в текущем каталоге, он вызывает инструмент Nmake (Nmake.exe), который делает одно из следующего:
Инструмент Make
| Тип файла | Описание |
|---|---|
| Определяет модули и файлы, которые будут включены в образ времени выполнения. | |
| Registry File (*.reg) | Определяет во время холодной загрузки ключи реестра и значения для созданного образа времени выполнения. |
| File |
Определяет во время холодной загрузки каталоги, файлы и ссылки файловой системы RAM для созданного образа времени выполнения. |
| Определяет во время холодной загрузки базы данных, которые будут включены в хранилище объектов созданного образа времени выполнения. | |
| String File (.str) | Определяет специфические для локализации строковые замещения для текста, который видит пользователь в файлах .reg, .dat, и .db. Каждая строка в файле .str должна заканчиваться <CR>, чтобы обеспечить правильную обработку. |
Специальные конфигурационные файлы образа времени выполнения применяются для аппаратной платформы; другие применяются к рабочим пространствам, которые содержат модули и компоненты на основе CE.
Независимо от области действия можно использовать условные блоки IF и ENDIF и переменные окружения в любом конфигурационном файле образа времени выполнения для модификации получающегося образа времени выполнения. Таблица 6.11 показывает области действия конфигурационных файлов образа времени выполнения.
| Имя файла | Область действия |
|---|---|
Common. |
Эти файлы применяются к проекту Common, который содержит базовые модули и компоненты на основе CE. |
IE. |
Эти файлы применяются к проекту IE, который содержит компоненты, которые поддерживают модули Microsoft Internet Explorer. |
Wceappsfe. |
Эти файлы применяются к проекту Wceapps, который содержит компоненты, которые поддерживают программное обеспечение обработки текста WordPad и электронного обмена сообщениями Inbox. |
Wceshellfe. |
Эти файлы применяются к проекту Wceshellfe, который содержит компоненты, которые поддерживают модули оболочки на основе CE. |
Msmq. |
Эти файлы применяются к проекту MSMQ, который содержит модули |
Platform. |
Эти файлы применяются к аппаратной платформе. |
Project. |
Эти файлы применяются к рабочему пространству, которое содержит образ времени выполнения на основе CE. |
Config. |
Этот файл применяется к образу времени выполнения. Он содержит разделы MEMORY и CONFIG для образа времени выполнения. |
Файл сборщика двоичного образа (.Makeimg.exe использует файлы .
Файл Platform. определяет
Файл Config. содержит разделы MEMORY и CONFIG для образа времени выполнения. Раздел MEMORY файла Config. определяет таблицу памяти для образа времени выполнения, определяя имя, адрес, размер, и тип областей MEMORY в образе времени выполнения.
При обновлении Platform. или Project. для включения файла определите следующие объекты:
MEMORY, определенную как тип RAMIMAGE.Используйте параметры Address и Size в таблице памяти для определения раздела памяти, предназначенного для RAM, а также для ROM. Параметр Address определяет адрес, где начинается раздел RAM. Вместе параметры Address и Size указывают адрес, где заканчивается раздел RAM.
Раздел MODULES файлов *.MEMORY файла Config.. Он модифицируется для добавления файлов *.dll и подпроектов в образ ОС.
Этот раздел может содержать до 2000 модулей, которые состоят из двух-частной комбинации исходного кода и данных. Следующий пример показывает столбцовый формат, используемый записью раздела MODULES в файле *.
| Name Path |
|---|
| MYDLL.DLL %_WINCEROOT%\RELEASE\MYDLL.DLL NK SHC |
Параметр name определяет имя входа раздела MODULES, как он появляется в таблице памяти. Обычно запись Name совпадает с именем файла, указанным Path.
Параметр path определяет полный путь доступа к файлу, как определено в разделе MODULES, который Romimage.exe включает в образ времени выполнения. Обычно имя файла Path совпадает с Name записи раздела MODULES.
Параметр определяет раздел RAMIMAGE области памяти в которую Romimage.exe загружает объектный модуль. Romimage.exe помещает объектные модули в указанное место памяти в том порядке, в котором они появляются в разделе MEMORY. Это место памяти соответствует разделу MEMORY, определенному в файле Config.. Существует только один RAMIMAGE на образ времени выполнения. Имя, которое используется для определения раздела MEMORY должно совпадать с именем, определенным в файле Config.
Параметр section override определяет тип записи раздела, как ее интерпретирует Romimage.exe, и может быть задан как или FILES. Когда этот параметр добавлен в запись, Romimage.exe игнорирует раздел, в котором находится запись, и интерпретирует запись как члена указанного раздела. Это является необязательным.
Параметр type определяет тип файла, и может быть комбинацией следующих символов:
S для определения как системного файла.H для определения как скрытого файла.R для сжатия ресурсов. Применяется только к разделу MODULES.C для сжатия всего, если применяется к модулю.D для отключения выполнения отладчика.N для пометки модуля как ненадежного. Применяется только к разделу MODULES.K для указания, что Romimage.exe должен зафиксировать модуль в адресе ядра.Несколько сайтов сообщества пользователей и новостных групп обсуждают различные темы и проблемы связанные с Windows Embedded CE:
http://msdn.microsoft.com/newsgroups /default.aspx?dg=microsoft. public.windowsce.platbuilder
http://msdn.microsoft.com/embedded/community/community/newsgrp/ default.aspx
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.