
- •Министерство образования и науки Украины
- •1. Определение системам реального времени
- •1.1. Основные понятия
- •1.2. Срв
- •1.3. Классификация срв
- •1.4. Структура срв
- •Основные требования к срв и их особенности
- •1.4.1. Ос
- •1.4.2. Основные архитектурные решения ос
- •1.4.3. Основные концепции ос
- •Прерывания
- •Системные вызовы
- •Файловая система
- •Процессы
- •Нити (потоки)
- •Понятие ресурса
- •1.5. Аппаратные среды срв
- •1.5.1. Мультипрограммная среда
- •Состояния процесса (см. Рисунок 4.).
- •1.5.2. Симметричная мультипроцессорная среда (рис. 5)
- •1.5.3. Распределенная среда (рис. 6)
- •1.6. Конфигурации клиент-серверных систем (рис.7.)
- •1.7. Средства ввода-вывода срв
- •2.1. Версии qnx
- •2.2. Posix-совместимость
- •2.3. Архитектура микроядра qnx
- •2.3.1. Микроядро
- •2.3.2. Системные процессы
- •2.3.3. Системные и пользовательские процессы
- •2.3.4. Драйверы устройств
- •2.3.5. Межпроцессное взаимодействие
- •2.3.6. Сеть qnx
- •2.4. Файлы и файловая система
- •2.4.1. Типы файлов
- •2.4.2. Жесткие ссылки
- •2.4.3. Символические ссылки
- •2.4.4. Named Special Device — именованные специальные устройства
- •2.4.5. Именованные программные каналы (fifo) (Именованный канал)
- •2.5. Структура файловой системы qnx
- •2.6. Концепция прав доступа
- •3. Начало работы
- •3.1. Интерфейс командной строки
- •3.2. Консоль командной строки
- •3.3. Соглашения по работе с командной строкой
- •3.4. Знакомство с shell
- •3.5. Обращение к домашнему каталогу
- •3.6. Базовые команды
- •3.6.1. Изменение текущего каталога
- •3.6.2. Просмотр содержимого каталогов
- •Жесткая ссылка обозначает ся так же, как файл, на который она ссылается, счетчик ссылок при этом будет иметь значение больше 1.
- •3.6.3. Создание новых каталогов
- •3.6.4. Копирование файлов
- •3.6.5. Перемещение файлов
- •3.6.6. Удаление файлов
- •3.6.7. Удаление каталогов
- •3.6.8. Просмотр содержимого файлов
- •3.6.9. Конкатенация (слияние) и просмотр файлов
- •3.6.10. Получение оперативной помощи
- •4. Объектно-ориентированное программирование
- •4.1. Системы программирования
- •4.2. Создание приложения
- •4.3. Средства отладки программ
- •5. Архитектура ос qnx
- •5.1. Типы процессов
- •5.2. Механизмы микроядра
- •5.3. Диспетчеризация потоков
- •5.4. Администратор процессов
- •5.5. Управление памятью
- •5.6. Управление пространством путевых имен
- •5.7. Пространство путевых имен
- •5.7.1. Файловая система qnx
- •5.7.2. Виртуальные устройства
- •Устройство /dev/null
- •Устройство /dev/zero
- •Устройство /dev/full
- •Устройства генерирования случайных чисел
- •5.8. Программы, процессы, нити
- •5.9. Свойства процессно-нитиевой структуры прв
- •5.10. Программный интерфейс qnx
- •5.10.1. Системные вызовы и функции стандартных библиотек
- •5.10.2. Обработка ошибок
- •5.11. Формальные параметры функции main
- •5.12. Разграничение доступа к файлам
- •5.13. Функции базового ввода/вывода
- •5.13.1. Открытие файла
- •5.13.2. Дублирование дескриптора файла
- •5.13.3. Доступ к файлу
- •6. Функции управления файловой системой
- •6.1. Смена корневого каталога
- •6.2. Смена текущего каталога
- •6.3. Создание каталога
- •6.4. Удаление каталога
- •6.5. Создание жесткой связи
- •6.6. Создание символической связи
- •6.7. Чтение символической связи
- •6.8. Переименование файла
- •6.9. Удаление файла
- •7. Микроядро
- •7.1. Запуск процессов
- •7.2. Запуск процесса из shell
- •7.3. Программный запуск процессов
- •7.3.1. Функция system()
- •7.3.2. Функции семейства exec*()
- •7.3.3. Функции семейства spawn*()
- •7.3.4. Функция fork()
- •7.3.5. Функция vfork()
- •7.4. Организация взаимодействия между процессами
- •7.5. Создание и удаление каналов Создание канала.
- •Удаление канала
- •7.6. Установление и удаление соединений с каналом Установление соединения
- •Int ConnectAttach(uint32_t nd, pid_t pid, int chid, unsigned index, int flags);
- •Разрыв соединения
- •Int ConnectDetach(int coid);
- •7.7. Передача сообщений
- •7.7.1. Посылка сообщения
- •IntMsgSend(int coid, constvoid* smsg, int sbytes, void* rmsg, int rbytes);
- •7.7.2. Прием сообщения
- •Int MsgReceive(int chid, void *msg, int bytes, struct _msg_info *info);
- •7.7.3. Посылка ответа
- •Int MsgReply(int rcvid,int status,const void* msg, int size);
- •7.7.4. Сценарии ответов
- •7.7.5. Управление сообщениями
- •7.7.6. Управление приемом сообщений
- •7.7.7. Управление передачей ответа
- •Int MsgSendv(int coid, const iov_t* siov, //Массив iov сообщения int sparts, //Количество iov сообщения const iov_t* riov, //Массив iov ответа int rbytes); //Количество iov ответа
- •Int MsgReceivev(int chid, const iov_t* riov, //Массив iov буфера int sparts, //Количество iov буфера struct_msg_info* riov);
5.7.2. Виртуальные устройства
В QNX есть ряд специальных символьных устройств, которым не соответствуют никакие аппаратные компоненты. Эти устройства являются виртуальными.
Устройство /dev/null
Устройство /dev/null служит двум целям.
- Поглощает любые данные, направляемые в устройство. В тех случаях, когда выводные данные программы не нужны, в качестве выходного файла назначают устройство /dev/null, например:
# verbose_command > /dev/null
- При чтении из устройства /dev/null всегда возвращается признак конца строки (файла). Если открыть /dev/null с помощью функции open() и попытаться прочесть данные из него с помощью функции read(), то функция вернет 0 байтов. При копировании содержимого файла /dev/null будет создан пустой файл нулевой длины:
# cp /dev/null empty_file
# ls -l empty_file
-rw-rw---- 1 ivanov ivanov 0 Mar 12 15:27 empty_file
Устройство /dev/zero
Устройство /dev/zero ведет себя так, как если бы оно было файлом бесконечной длины, заполненным одними нулями. Сколько бы данных ни запрашивалось из этого файла, они всегда предоставляются в необходимом количестве.
Файл /dev/zero удобно использовать в функциях выделения памяти, которые отображают этот файл в память, чтобы инициализировать её нулями.
Устройство /dev/full
Устройство /dev/full ведет себя так, как если бы оно было файлом, в котором нет свободного места. Операция записи в этот файл завершается ошибкой, и в переменную errno помещается код, свидетельствующий о том, что устройство переполнено.
Этот файл удобен для проверки того, как программа будет вести себя в случае, если при записи в файл возникает нехватка места.
Устройства генерирования случайных чисел
Специальные устройства /dev/random и /dev/urandom предоставляют доступ к средствам генерирования случайных чисел, входящим в QNX. Эти устройства для получения случайных чисел используют внешний "источник хаоса". Замеряя задержки между действиями пользователя, в частности нажатиями клавиш и перемещениями мыши, устройства способны генерировать непредсказуемый поток действительно случайных чисел. Получить доступ к этому потоку можно путем чтения из устройств /dev/random и /dev/urandom.
Разница между устройствами заключается в том, что если попытаться прочесть большое количество случайных чисел из устройства /dev/random и при этом нем выполнять никаких пользовательских действий (не нажимать клавиши, не перемещать мышь и т.п.), то случайные числа заканчиваются и операция чтения блокируется. Только когда пользователь проявит какую-то активность, система сгенерирует новые случайные числа и разблокирует операцию чтения. В противоположность этому операция чтения из устройства /dev/urandom никогда не блокируется. Если в системе заканчиваются случайные числа, используется криптографический алгоритм, чтобы сгенерировать псевдослучайные числа из последней цепочки случайных чисел.
Пространство путевых имен представляет собой дерево каталогов и файлов, в вершине которого находится корневой каталог / ("root"). При запуске каждый администратор ресурсов регистрирует у Администратора процессов префикс или свою зону ответственности, соответствующую ветви единого дерева. Сам модуль procnto при загрузке регистрирует в пространстве путевых имен несколько префиксов:
/ — корень ("root") файловой системы, к которому монтируются все остальные префиксы;
/ргос/ — каталог, в который отображается информация о запущенных процессах, представленных их идентификаторами (PID);
/рroc/boot/— каталог, в который в виде "плоской" файловой системы отображаются файлы, входящие в состав загрузочного образа QNX;
/dev/zero — устройство, которое при чтении из него всегда возвращает ноль. Используется, например, для того, чтобы заполнить нолями страницы памяти;
/dev/mem — устройство, представляющее всю физическую память.
Префикс, к которому администратор ресурсов запрашивает присоединение своего поддерева, называется точкой монтирования (mountpoint). Точки монтирования могут перегружаться, т. е. к одной точке могут подключить свои поддеревья несколько администраторов ресурсов. Кроме того, Администратор процессов позволяет создавать символические префиксы, т. е. регистрировать в пространстве путевых имен ссылки на существующий файл:
ln -Ps существующий_файл имя_ссылки
Механизм пространства путевых имен позволяет Администратору процессов определять, какой из администраторов ресурсов должен выполнить поступивший запрос на ввод/вывод данных. Алгоритм будет таким:
Процесс выполняет системный вызов ореп() для того, чтобы открыть файл. При этом указывается полное (путевое) имя файла. Библиотечная функция open() посылает Администратору процессов QNX-сообщение определенной структуры, спрашивая что-то вроде: "Какой из администраторов ресурсов отвечает за этот файл?".
Администратор процессов сопоставляет путевое имя файла с деревом префиксов и возвращает функции ореп() сообщение-ответ, содержащее идентификатор администратора ресурсов
Функция open() напрямую обращается к администратору ресурса с запросом на открытие файла.
Администратор ресурса создает у себя структуру данных, называемую блоком управления открытым контекстом (ОСВ, Open Control Block) и возвращает функции оpen() файловый дескриптор, который включает:
файловый дескриптор, уникальный внутри одного процесса;
идентификатор процесса, уникальный для узла сети;
информацию о файле (например, информацию о текущем файловом указателе).
Новый ОСВ создается при каждом вызове функции оpen()..
Теперь прикладной процесс может напрямую запрашивать у администратора ресурсов операции чтения/записи, используя полученный файловый дескриптор. Администратор ресурсов, в свою очередь, использует ОСВ для того, чтобы различать запросы разных процессов.
Администратор процессов хранит пространство путевых имен в виде таблицы, где для каждого зарегистрированного префикса хранится 5 параметров:
идентификатор узла сети, на котором выполняется администратор ресурса;
номер процесса администратора ресурса;
номер канала, через который администратор ресурса принимает
клиентские запросы (подробнее каналы описаны в разд. 3.3);
идентификатор префикса (используется, если администратор ресурсов зарегистрировал несколько префиксов);
тип префикса (этот параметр во вводе/выводе не используется).
ФРАГМЕНТ*2 убрал