Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект Лекций ПСРВ.doc
Скачиваний:
142
Добавлен:
12.02.2016
Размер:
2.73 Mб
Скачать

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 существующий_файл имя_ссылки

Механизм пространства путевых имен позволяет Администратору процессов определять, какой из администраторов ресурсов должен выполнить поступивший запрос на ввод/вывод данных. Алгоритм будет таким:

  1. Процесс выполняет системный вызов ореп() для того, чтобы открыть файл. При этом указывается полное (путевое) имя файла. Библиотечная функция open() посылает Администратору процессов QNX-сообщение определенной структуры, спрашивая что-то вроде: "Какой из администраторов ресурсов отвечает за этот файл?".

  2. Администратор процессов сопоставляет путевое имя файла с деревом префиксов и возвращает функции ореп() сообщение-ответ, содержащее идентификатор администратора ресурсов

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

Администратор ресурса создает у себя структуру данных, называемую блоком управления открытым контекстом (ОСВ, Open Control Block) и возвращает функции оpen() файловый дескриптор, который включает:

  • файловый дескриптор, уникальный внутри одного процесса;

  • идентификатор процесса, уникальный для узла сети;

  • информацию о файле (например, информацию о текущем файловом указателе).

Новый ОСВ создается при каждом вызове функции оpen()..

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

Администратор процессов хранит пространство путевых имен в виде таблицы, где для каждого зарегистрированного префикса хранится 5 параметров:

  • идентификатор узла сети, на котором выполняется администратор ресурса;

  • номер процесса администратора ресурса;

  • номер канала, через который администратор ресурса принимает

клиентские запросы (подробнее каналы описаны в разд. 3.3);

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

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

ФРАГМЕНТ*2 убрал