Опубликован: 06.12.2004 | Доступ: свободный | Студентов: 1087 / 122 | Оценка: 4.76 / 4.29 | Длительность: 20:58:00
ISBN: 978-5-9556-0021-5
Дополнительный материал 1:

Обзор POSIX-профилей для поддержки систем реального времени и встроенных систем

< Лекция 10 || Дополнительный материал 1 || Дополнительный материал 2 >
Ключевые слова: ПО, компонент, POSIX, Си, устройство управления памятью, приложение, память, соответствие реализации, операционная система, строгое соответствие, соответствие с использованием расширений, подпрофиль, место, подмножество, время реакции, префикс, application, environment, PSE, управляющие, радар, гранулярность, целевая платформа, список, ACO, rewind, mkfifo, execl, getpid, alarm, polling, basename, FTW, блокировка чтение-запись, единица, инверсия приоритетов, исключение, функция, активного ожидания, типизированная память, ОС реального времени, PSO, vxworks, QNX, единое адресное пространство, приоритетное планирование, целочисленный семафор, поддержка, защита памяти, многопроцессорная конфигурация, локальная очередь, среда компиляции, системы реального времени, потоки управления, разделяемая память, интерфейс ввода, доступ, многозадачность, значение, политика планирования, маска, объект, файловая система, функции ввода/вывода, часы процессорного времени, надежность, предсказуемость, поток, таймер, Дополнение, интерфейс, аргумент, файловый дескриптор, команда, указатель, буфер, драйвер, макрос

Введение

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

Один из общепринятых способов повышения мобильности ПО - стандартизация окружения приложений: предоставляемых программных интерфейсов, утилит и т.п. На уровне системных сервисов подобное окружение описывается стандартами POSIX.1 1 - 4, 10 - 13 или POSIX.5 14, на уровне языка программирования - стандартом конкретного языка, например, языков Си [ 15 ] или Ада [ 16 ] .

К сожалению, в силу широты спектра и существенно разных масштабов систем реального времени и встроенных систем, соответствие даже обязательному ядру (и, тем более, полному варианту) стандарта POSIX.1 в общем случае невозможно. Ограничения, налагаемые аппаратными платформами, заставляют минимизировать как объем ресурсов, используемых операционной системой (ОС) и приложениями, так и набор предоставляемых и применяемых системных сервисов. Например, если отсутствует устройство управления памятью, приложение должно целиком располагаться в оперативной памяти и быть однопроцессным; если отсутствует долговременная память, невозможна организация и, следовательно, использование файловой системы (если не иметь в виду диски в оперативной памяти) и т.п.

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

Основные понятия

Напомним некоторые понятия, ассоциированные со стандартом POSIX.1.

Важнейшим является понятие соответствия стандарту POSIX.1. Подобно тому, как у всякого интерфейса есть две стороны: вызывающая и вызываемая, две стороны есть и у POSIX-соответствия: соответствие реализации (операционной системы) и приложения.

Реализация (операционная система), соответствующая стандарту POSIX.1, должна поддерживать все обязательные служебные программы, функции, заголовочные файлы с обеспечением специфицированного в стандарте поведения.

ОС может предоставлять возможности, помеченные в стандарте как дополнительные, а также нестандартные возможности. Если утверждается, что поддерживается некоторое расширение, это должно производиться непротиворечивым образом, для всех необходимых частей, так, как описано в стандарте.

В документации на ОС должны быть отражены вопросы соответствия стандарту POSIX.1, описаны поддерживаемые дополнительные и нестандартные возможности.

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

(Отметим в скобках, что для реализации понятие строгого POSIX-соответствия бессмысленно хотя бы по той причине, что не бывает операционных систем без средств администрирования, а они не описываются данным стандартом.)

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

Допускается существование подпрофилей, описывающих подмножества стандартных возможностей. Реализация, соответствующая подпрофилю, может функционировать на аппаратных платформах с ограниченными ресурсами и/или обслуживать нужды специфических приложений. Именно это и требуется для систем реального времени и встроенных систем. Следовательно, задача состоит в том, чтобы специфицировать представительный спектр подпрофилей, отражающих потребности систем различных классов - от минимальных до многоцелевых, универсальных. Эта задача решена разработчиками стандарта POSIX.13 [12].

В настоящей работе рассматривается наиболее свежая из доступных редакций стандарта POSIX.13, принятая в 2003 году и опубликованная 10 сентября 2004 года. Эта редакция существенно отличается от предыдущей (1998 года) хотя бы по той причине, что за прошедшие годы базовый стандарт POSIX.1 был значительно расширен (см. [13, 14]) и в настоящее время содержит достаточно возможностей, чтобы сделать разработку и реализацию соответствующих ему операционных систем и приложений реального времени делом технически и экономически оправданным.

Чтобы показать место стандарта POSIX.13-2003 в общей иерархии профилей открытых систем, приведем еще несколько определений.

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

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

Профиль окружения приложения - это профиль, специфицирующий полное и согласованное подмножество окружения открытой системы.

Платформа приложения - это совокупность ресурсов, обеспечивающих работу приложения.

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

Общий профиль окружения приложения - это профиль окружения приложения, не ограниченный рамками определенного класса приложений или сообщества пользователей.

Профилем окружения реального времени называется профиль, предназначенный для поддержки приложений с ограничениями на время реакции.

В иерархии стандартизованных профилей на верхнем уровне находятся профили окружения открытых систем (при их именовании используется префикс P), на следующем - профили окружения приложений (Application Environment Profiles, AEP), ниже - системные профили (префикс PS), еще ниже - общие профили окружения (префикс PSE), под ними - профили окружения реального времени (префикс PSE5).

В стандарте POSIX.13-2003 определены следующие четыре профиля:

  • профиль для минимальных систем реального времени (PSE51);
  • профиль для управляющих систем реального времени (PSE52);
  • профиль для специализированных систем реального времени (PSE53);
  • профиль для универсальных систем реального времени (PSE54).

Перечисленные классы систем и профили для них будут детально рассмотрены далее.

Под встроенной компьютерной системой в стандарте POSIX.13-2003 понимается совокупность аппаратного и программного обеспечения, являющаяся неотъемлемой частью более крупной системы и используемая для управления и/или непосредственного мониторинга этой системы с применением специальных аппаратных устройств.

Отметим широту приведенного определения. Ему удовлетворяют как внутренние микропроцессоры сотовых телефонов или дисковых приводов, так и мощные компьютеры, занимающие огромные залы и управляющие большими радарами.

Единицы функциональности и опции стандарта POSIX.1

Для нужд профилей, стандартизуемых спецификациями POSIX.13-2003, необходима более тонкая гранулярность возможностей, чем та, что предоставляется опциями базового стандарта POSIX.1. Чтобы такую гранулярность обеспечить, вводится дополнительное понятие единицы функциональности как отдельно реализуемого элемента окружения открытой системы. Приложение, строго соответствующее профилю, должно использовать только возможности, предоставляемые указанными в профиле опциями и единицами функциональности.

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

Для языка Си выделены следующие единицы функциональности:

  • POSIX_C_LANG_JUMP. В эту единицу входят лишь две функции - longjmp() и setjmp().
  • POSIX_C_LANG_MATH - математическая библиотека, от acos() до truncl().
  • POSIX_C_LANG_SUPPORT - стандартная библиотека языка Си: функции abs(), asctime(), malloc(), memcpy(), strcpy(), va_start(), vsscanf() и др.
  • POSIX_C_LANG_WIDE_CHAR - работа с широкими символами: btowc(), iswalnum(), mblen(), towlower(), wcscpy(), wmemset().
  • POSIX_DEVICE_IO - clearerr(), close(), fclose(), fgets(), printf(), write().
  • POSIX_DEVICE_SPECIFIC - cfgetispeed(), tcflow(), ttyname().
  • POSIX_EVENT_MGMT - FD_CLR(), select().
  • POSIX_FD_MGMT - dup, fcntl(), rewind().
  • POSIX_FIFO - mkfifo().
  • POSIX_FILE_ATTRIBUTES - chmod(), chown(), umask().
  • POSIX_FILE_LOCKING - flockfile(), getc_unlocked().
  • POSIX_FILE_SYSTEM - access(), chdir(), creat(), mkdir(), stat(), tmpfile(), utime().
  • POSIX_FILE_SYSTEM_EXT - glob(), globfree().
  • POSIX_JOB_CONTROL - setpgid(), tcgetpgrp(), tcsetpgrp().
  • POSIX_MULTI_PROCESS - _Exit(), assert(), atexit(), clock(), execl(), fork(), getpid(), sleep(), wait(), waitpid().
  • POSIX_NETWORKING - accept(), bind(), connect(), getaddrinfo(), gethostbyname(), getsockopt(), htonl(), inet_addr(), recv(), send(), socket().
  • POSIX_PIPE - pipe().
  • POSIX_REGEXP - regcomp(), regexec().
  • POSIX_RW_LOCKS - pthread_rwlock_init(), pthread_rwlock_rdlock(), pthread_rwlockattr_init().
  • POSIX_SHELL_FUNC - popen(), system(), wordexp().
  • POSIX_SIGNALS - abort(), alarm(), kill(), sigaction(), sigwait().
  • POSIX_SIGNAL_JUMP - siglongjmp(), sigsetjmp().
  • POSIX_SINGLE_PROCESS - confstr(), environ, errno, getenv(), sysconf(), uname().
  • POSIX_STRING_MATCHING - fnmatch(), getopt(), optopt.
  • POSIX_SYMBOLIC_LINKS - lstat(), readlink(), symlink().
  • POSIX_SYSTEM_DATABASE - getgrgid(), getpwnam(), getpwuid().
  • POSIX_THREADS_BASE - pthread_atfork(), pthread_attr_init(), pthread_cleanup_pop(), pthread_cond_init(), pthread_create(), pthread_getspecific(), pthread_mutex_init(), pthread_mutex_lock(), pthread_once(), pthread_sigmask(), pthread_testcancel().
  • POSIX_USER_GROUPS - getgid(), getlogin(), seteuid().
  • POSIX_WIDE_CHAR_IO - fgetwc(), vfwprintf(), wscanf().
  • XSI_C_LANG_SUPPORT - _tolower(), a64l(), drand48(), getcontext(), hcreate(), lfind(), memccpy(), strdup(), swab(), tfind(), timezone.
  • XSI_DBM - dbm_open(), dbm_store().
  • XSI_DEVICE_IO - poll(), pread(), writev().
  • XSI_DEVICE_SPECIFIC - grantpt(), posix_openpt(), ptsname().
  • XSI_DYNAMIC_LINKING - dlopen(), dlsym().
  • XSI_FD_MGMT - truncate().
  • XSI_FILE_SYSTEM - basename(), ftw(), lockf(), mknod(), realpath(), sync(), tempnam().
  • XSI_I18N - catopen(), nl_langinfo().
  • XSI_IPC - ftok(), msgget(), semget(), shmat().
  • XSI_JOB_CONTROL - tcgetsid().
  • XSI_JUMP - _longjmp(), _setjmp().
  • XSI_MATH - j0(), yn().
  • XSI_MULTI_PROCESS - getpriority(), getrusage(), nice(), ulimit(), waitid().
  • XSI_SIGNALS - bsd_signal(), killpg(), sighold(), ualarm().
  • XSI_SINGLE_PROCESS - gethostid(), gettimeofday(), putenv().
  • XSI_SYSTEM_DATABASE - endpwent(), getpwent(), setpwent().
  • XSI_SYSTEM_LOGGING - closelog(), openlog(), setlogmask(), syslog().
  • XSI_THREAD_MUTEX_EXT - pthread_mutexattr_gettype(), pthread_mutexattr_settype().
  • XSI_THREADS_EXT - pthread_attr_getguardsize(), pthread_attr_getstack(), pthread_attr_setconcurrency().
  • XSI_TIMERS - getitimer(), setitimer().
  • XSI_USER_GROUPS - getgrent(), getutxent(), pututxline().
  • XSI_WIDE_CHAR - wcswidth(), wcwidth().

Отметим, что единицы функциональности выделены в стандарте POSIX.13-2003 с запасом. В специфицированных профилях не фигурируют функции, обслуживающие блокировки чтение-запись (единица функциональности POSIX_RW_LOCKS ), поскольку применение подобных блокировок может вызвать неограниченную инверсию приоритетов, а также большинство XSI-единиц (исключение составляют единицы функциональности XSI_DYNAMIC_LINKING, XSI_SYSTEM_LOGGING, XSI_THREAD_MUTEX_EXT, XSI_THREADS_EXT и функция mknod() из единицы XSI_FILE_SYSTEM ).

В приложении B стандарта POSIX.13-2003 приведены таблицы соответствия между опциями системных интерфейсов и служебных программ с одной стороны, и принадлежащими им функциями и утилитами с другой стороны. Мы не будем детально останавливаться на этом соответствии. Укажем лишь, что для стандартизованных профилей не требуются функциональные возможности, предоставляемые опциями _POSIX_BARRIERS (причина - вторичность барьеров как примитива синхронизации для однопроцессорных систем), _POSIX_IPV6 (IPv6 продолжает оставаться экзотикой), _POSIX_SPIN_LOCKS (активное ожидание может привести к тупику), _POSIX_TYPED_MEMORY_OBJECTS (типизированная память встречается только на специфических аппаратных платформах), а из опций для служебных программ могут потребоваться лишь _POSIX2_C_DEV, _POSIX2_CHAR_TERM, _POSIX2_FORT_RUN, _POSIX2_SW_DEV, _POSIX2_UPE для нужд инструментальной платформы.

Не всем опциям соответствуют функции или служебные программы. Иногда требуется наличие в реализации определенных объектов или особенностей поведения. Таковы, например, существенные в рассматриваемом контексте опции _POSIX_CHOWN_RESTRICTED, _POSIX_MONOTONIC_CLOCK, _POSIX_PRIORITIZED_IO, _POSIX_RAW_SOCKETS, _POSIX_SAVED_IDS, _POSIX_SPORADIC_SERVER, _POSIX_THREAD_SPORADIC_SERVER, _POSIX_VDISABLE.

Классификация систем реального времени и встроенных систем

Авторы стандарта POSIX.13-2003 основывали свою работу на опыте создания и использования ядер ОС реального времени, имеющих небольшие размеры и, как правило, не-Unix-происхождение, а также возрастающего числа POSIX-совместимых ядер с возможностями реального времени. Были рассмотрены такие коммерчески успешные продукты, как pSOS, VRTX32, VxWorks, а также спецификации для встроенных систем ORKID, TRT и ulTRON. Позднее, при подготовке текущей редакции стандарта, к этому списку добавились RTLinux, QNX и RTEMS.

Для современных систем реального времени и встроенных систем характерны следующие базовые свойства и возможности организации многозадачности и синхронизации:

  • наличие множества потоков управления с единым адресным пространством без защиты памяти и приоритетным планированием с вытеснением;
  • непосредственное управление распределением памяти;
  • межпотоковое взаимодействие посредством передачи сообщений;
  • синхронизация посредством мьютексов, двоичных или целочисленных семафоров;
  • возможность ожидания наступления нескольких событий;
  • использование высокоточных таймеров;
  • управление прерываниями, переопределение обработчиков прерываний, использование сигналов, обработка исключительных ситуаций;
  • минимальные возможности синхронного ввода/вывода ( open(), close, read(), write(), ioctl(), posix_devctl() );
  • прямой ввод/вывод, минуя ядро ОС;
  • наличие отладочного интерфейса;
  • функционирование в условиях ограниченности ресурсов (в первую очередь - оперативной памяти).

Применительно к вводу/выводу ОС реального времени обычно предоставляет следующие средства и возможности:

  • именованные устройства ввода/вывода;
  • поддержку последовательных линий ввода/вывода;
  • каналы;
  • устанавливаемые пользовательские драйверы устройств;
  • ввод/вывод, отображенный в память.

Поддержка локальных файловых систем (возможно, упрощенных, например, одноуровневых):

  • именованные файлы;
  • каталоги;
  • предварительное резервирование под файл непрерывного дискового фрагмента;
  • возможно, совместимость с употребительными файловыми системами (например, с MS-DOS);
  • отсутствие средств управления доступом.

Сетевые коммуникации:

  • поддержка протокола TCP/IP;
  • поддержка приложений, таких как FTP, TELNET и т.п.

Поддержка удаленных файловых систем:

  • удаленный доступ к файловой системе (разумеется, без выполнения требований реального времени).

Защита памяти:

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

Поддержка многопроцессорных конфигураций может осуществляться одним из следующих способов:

  • сетевым, с непрозрачным доступом к удаленным объектам (например, посредством удаленного вызова процедур);
  • распределенным, с прозрачным доступом, но без балансировки нагрузки;
  • симметричным, с глобальной очередью планирования задач (и, возможно, с локальными очередями).

Поддержка процесса разработки приложений:

  • командный интерпретатор;
  • текстовый редактор;
  • среда компиляции/сборки/отладки;
  • управление доступом.

Таков спектр возможностей, из которых формируются рассматриваемые профили.

В стандарте POSIX.13-2003 выделено четыре вложенных класса систем реального времени и встроенных систем:

  • минимальные системы реального времени;
  • управляющие системы реального времени;
  • специализированные системы реального времени;
  • универсальные системы реального времени.

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

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

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

Управляющие системы реального времени отличаются от минимальных наличием файловой системы, которая может располагаться в оперативной или флэш-памяти. С программной точки зрения добавляются интерфейсы для поддержки файловой системы и асинхронного ввода/вывода.

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

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

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

Универсальные системы реального времени, согласно стандарту POSIX.13-2003, должны быть самодостаточными, снабженными высокоскоростными запоминающими устройствами, терминальными, сетевыми и специализированными интерфейсами. Такие системы должны поддерживать выполнение смеси задач, лишь часть из которых относится к классу задач реального времени.

Поскольку пользователи могут организовывать интерактивные сеансы с универсальными системами реального времени, должна обеспечиваться поддержка всех обязательных служебных программ, определенных в стандарте POSIX.1. Многозадачность может быть реализована на уровне потоков управления и/или процессов.

Профиль для минимальных систем реального времени

Профиль для минимальных систем реального времени в стандарте POSIX.13-2003 именуется PSE51. Имена, зарезервированные для этого профиля, начинаются с префикса _POSIX_AEP_REALTIME. Если реализация поддерживает этот профиль, в заголовочном файле <unistd.h> должно быть определено имя _POSIX_AEP_REALTIME_MINIMAL со значением 200312L. Если реализация выполнена на языке Си и поддерживает программную среду для этого языка, должно быть определено имя _POSIX_AEP_REALTIME_LANG_C99.

Реализация должна поддерживать следующие единицы функциональности: POSIX_C_LANG_JUMP, POSIX_C_LANG_SUPPORT, POSIX_DEVICE_IO, POSIX_FILE_LOCKING, POSIX_SIGNALS, POSIX_SINGLE_PROCESS, POSIX_THREADS_BASE, XSI_THREAD_MUTEX_EXT, XSI_THREADS_EXT.

В число поддерживаемых опций входят: _POSIX_CLOCK_SELECTION, _POSIX_FSYNC, _POSIX_MEMLOCK, _POSIX_MEMLOCK_RANGE, _POSIX_MONOTONIC_CLOCK, _POSIX_REALTIME_SIGNALS, _POSIX_SEMAPHORES, _POSIX_SHARED_MEMORY_OBJECTS, _POSIX_SYNCHRONIZED_IO, _POSIX_THREAD_ATTR_STACKADDR, _POSIX_THREAD_ATTR_STACKSIZE, _POSIX_THREAD_CPUTIME, _POSIX_THREAD_PRIO_INHERIT, _POSIX_THREAD_PRIO_PROTECT, _POSIX_THREAD_PRIORITY_SCHEDULING, _POSIX_THREAD_SPORADIC_SERVER, _POSIX_TIMEOUTS, _POSIX_TIMERS.

Значение TIMER_MAX должно быть не меньше 64, RTSIG_MAX - не менее 16.

Для политики планирования SCHED_RR необходимо поддерживать по крайней мере 31 приоритет, не превосходящий максимальное значение приоритета для политики SCHED_FIFO.

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

Соответствие профилю PSE51 налагает некоторые ограничения и на приложения.

Приложение должно действовать так, как если бы значение CHILD_MAX было нулевым.

Сигналы не должны приводить к ненормальному завершению (единственного, неявного) процесса.

Нельзя вызывать функцию kill() с отрицательным аргументом, отличным от -1, поскольку группы процессов профилем PSE51 не поддерживаются.

Маска создания файлов должна равняться S_IRWXU ; иными словами, объект должен быть полностью доступен своему создателю.

Функции open(), fopen(), freopen() не должны использоваться для создания новых файлов, поскольку универсальная файловая система может и не существовать. Аналогично, аргументы, являющиеся именами файлов, не должны нести семантики файловой системы.

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

Не следует вызывать функцию sysconf() с аргументом _POSIX_VERSION, поскольку результирующее значение не может быть осмысленным.

Профилем PSE51 предусмотрена поддержка инструментальной платформы, позволяющей готовить приложения для платформы выполнения, соответствующие рассматриваемому профилю. Для среды разработки на языке Си на инструментальной платформе должны поддерживаться опции _POSIX2_C_DEV и _POSIX2_SW_DEV.

Несколько моментов заслуживают отдельных пояснений. В минимальный профиль включены опции, обеспечивающие совместимость вверх без модификации исходных текстов приложений. К числу таких опций принадлежат, например, _POSIX_MEMLOCK и _POSIX_MEMLOCK_RANGE. Поскольку виртуальная память не поддерживается, приложение и так будет целиком располагаться в физической памяти, так что реализацию соответствующих функций можно сделать пустой, а их вызовы на минимальных системах ничему не помешают. Зато при переходе на более масштабные конфигурации удержание в физической памяти может оказаться не просто полезным, но необходимым.

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

Сигналы реального времени обслуживают асинхронную модель обработки событий и исключительных ситуаций. По сравнению с базовым стандартом POSIX.1 их минимальное число увеличено вдвое - с 8 до 16.

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

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

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

По сравнению с базовым стандартом POSIX.1 минимальное число таймеров увеличено вдвое, с 32 до 64, и сделано равным минимальному числу потоков управления, которое должна поддерживать реализация. В результате каждый поток может завести свой таймер, что нередко требуется в приложениях реального времени.

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

В минимальный профиль не включены средства трассировки и сетевые средства. Это позволяет уменьшить размер ОС и приложений.

Профиль для управляющих систем реального времени

В профиль PSE52 для управляющих систем реального времени, в дополнение к PSE51, включены следующие единицы функциональности: POSIX_C_LANG_MATH, POSIX_FD_MGMT, POSIX_FILE_SYSTEM.

Добавлены также опции _POSIX_MAPPED_FILES, _POSIX_MESSAGE_PASSING, _POSIX_TRACE, _POSIX_TRACE_EVENT_FILTER, _POSIX_TRACE_LOG.

Можно видеть, что, по сравнению с минимальным, в профиль для управляющих систем вошли четыре основные группы расширений.

Поддержка упрощенной файловой системы позволяет создавать и удалять файлы, но не включает такие единицы функциональности, как POSIX_FIFO, POSIX_FILE_ATTRIBUTES и POSIX_FILE_SYSTEM_EXT, а также опцию _POSIX_ADVISORY_INFO.

Средства передачи сообщений присутствуют в коммерческих продуктах рассматриваемого класса, поэтому они вошли в профиль PSE52.

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

Математическая библиотека также полезна для управляющих систем.

Профиль для специализированных систем реального времени

Профиль PSE53 для специализированных систем реального времени является расширением PSE52. В него дополнительно включены единицы функциональности POSIX_EVENT_MGMT, POSIX_MULTI_PROCESS, POSIX_NETWORKING, POSIX_PIPE, POSIX_SIGNAL_JUMP, а также опции _POSIX_ASYNCHRONOUS_IO, _POSIX_RAW_SOCKET, _POSIX_SPAWN, _POSIX_THREAD_PROCESS_SHARED.

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

Еще одно важнейшее расширение состоит в поддержке сетевых коммуникаций. При работе с сокетами обычно используется функция select() ; этим объясняется включение в профиль PSE53 единицы функциональности POSIX_EVENT_MGMT.

Профиль для универсальных систем реального времени

Универсальные системы реального времени должны быть самодостаточными. По этой причине в профиль PSE54 для универсальных систем вошли практически все единицы функциональности и опции базового стандарта POSIX.1.

Более точно, по сравнению с профилем PSE53 добавлены следующие единицы функциональности: POSIX_C_LANG_WIDE_CHAR, POSIX_DEVICE_SPECIFIC, POSIX_FIFO, POSIX_FILE_ATTRIBUTES, POSIX_FILE_SYSTEM_EXT, POSIX_JOB_CONTROL, POSIX_REGEXP, POSIX_SHELL_FUNC, POSIX_STRING_MATCHING, POSIX_SYMBOLIC_LINKS, POSIX_SYSTEM_DATABASE, POSIX_USER_GROUPS, POSIX_WIDE_CHAR_IO, XSI_DYNAMIC_LINKING, XSI_SYSTEM_LOGGING.

Добавлена поддержка следующих опций: _POSIX_ADVISORY_INFO, _POSIX_CHOWN_RESTRICTED, _POSIX_PRIORITIZED_IO, _POSIX_SAVED_IDS, _POSIX_THREAD_SAFE_FUNCTIONS, _POSIX_VDISABLE.

Отдельно упомянем добавленные в профиль PSE54 опции, описывающие служебные программы: _POSIX2_C_DEV, _POSIX2_CHAR_TERM, _POSIX2_FORT_RUN, _POSIX2_SW_DEV, _POSIX2_UPE.

Стандарт на интерфейс управления устройствами

В 2003 году был принят, а 9 сентября 2004 года опубликован стандарт на интерфейс управления устройствами POSIX.26-2003 [15]. Его можно назвать стандартом одной функции - posix_devctl(), являющейся улучшенным (более безопасным в плане контроля типов) вариантом известной функции ioctl(). Поддержка всех возможностей, предусмотренных стандартом POSIX.26, обязательна для всех рассмотренных выше профилей PSE51 - PSE54.

Функция posix_devctl() описывается следующим образом.

#include <devctl.h>

int posix_devctl (int fd, int dcmd, void *restrict dev_data_ptr, size_t nbyte,
                  int *restrict dev_info_ptr);

В случае нормального завершения результат функции равен нулю; в противном случае возвращается номер ошибки.

Аргумент fd - это файловый дескриптор, соответствующий устройству, dcmd - команда управления, dev_data_ptr - указатель на буфер для обмена данными между приложением и драйвером устройства, nbyte - размер буфера, dev_info_ptr - указатель на целочисленный объект, посредством которого драйвер может вернуть приложению дополнительную (по сравнению с результатом) информацию о статусе устройства.

Отметим одну тонкость. Если значение nbyte равно нулю, поведение функции posix_devctl() зависит от реализации. Это позволяет на исторически сложившихся платформах определить posix_devctl() через ioctl() как макрос, не внося изменения в драйверы.

Заключение

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

< Лекция 10 || Дополнительный материал 1 || Дополнительный материал 2 >