logo search
Лекции_по_ОС / ТОС_11_п_вв_выв_слайды

Vnode а также inode физической файловой системы, где расположен специальный файл устройства, и соответствующий ему vnode.

Для связи всех этих индексных дескрипторов между собой snode имеет два поля: s commonvp, указывающее на common snode, и s_realvp, указы-вающее~на vnode специального файла устройства файловой системы, где расположен последний.

Использование тех или иных vnode и связанных с ними inode или snode

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

Большинство из этих операций не зависят от имени специального файла

устройства и, соответственно, от реальной файловой системы, в которой

он расположен. Эти операции выполняются через vnode, соответствующий (сommon snode. Однако существует ряд операций, выполнение которых зависит от конкретного специального файла устройства, через который процесс взаимодействует с драйвером. Примером может служить проверка прав доступа при открытии специального файла устройства, которые расположены в vnode/inode реальной файловой системы. В этом случае используется vnode соответствующего специального файла устройства.

Схема описанной архитектуры приведена на рис. 5.5.

Клоны

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

Во многих случаях использование различных младших номеров позволяет

нескольким процессам осуществлять одновременную независимую работу

с устройством (или псевдоустройством). Каждый младший номер при этом соответствует логическому драйверу, поддерживающему собственные

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

Возможным сценарием доступа к такому устройству может являться пере-

бор различных младших номеров (соответствующих специальных файлов),

пока операция open () не завершится успешно. Это будет гарантировать,

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

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

Когда процесс открывает специальный файл устройства, происходит инициализация соответствующего snode и вызов функции spec_open(}, peализованной в файловой системе specfs, о которой только что говорилось, функция, в свою очередь, вызывает функцию драйвера ххореn (), передавая ей в качестве аргумента указатель на номера устройства, сохраненного в поле s_dev snode. Одной из схем реализации клонов является пользование зарезервированного младшего номера. Когда процесс от­зывает специальный файл устройства с этим номером, функция xxopenO выбирает неиспользуемый младший номер и соответственно ридирует данные snode (с помощью указателя на vnode, передавае­мые ей spec_open ()). Поскольку доступ процесса к драйверу осуществля­ется через vnode файловой системы specfs, все последующие операции будут пользовать новый младший номер. Таким образом, процесс получит доступ к новому логическому устройству. Эта схема приведена на рис. 5.6.

Другой подход заключается в использовании специального драл печивающего создание клонов, — драйвера клонов (clone driver). При этом все драйверы, чье "размножение" обеспечивается таким образом, имеют один и тот же старший номер, адресующий драйвер клонов Младший номер адресует собственно драйвер, т. е. представляет собой старший номер реального устройства, для которого создается клон. Примеры использования такой схемы можно обнаружить для драйверов системы STREAMS, с помощью которых часто реализуются сетевые протоколы и терминальный доступ, включая псевдотерминалы. Это можно заметить, рассмотрев подробный список файлов, отвечающих за эти устройства:

В данном случае старший номер всех драйверов равен 11 - - это драйвер клонов. Если проанализировать информацию файла, скажем, tcp, то станет понятно, что старший номер драйвера этого протокола равен 42, для файла tcp он представлен младшим номером устройства. Когда процесс открывает этот файл, производится вызов функции clopenO драйвера клонов, которой передаются номера устройства. Функция clopenO использует младший номер для поиска требуемых точек входа драйвера TCP в коммутаторе устройств cdevsw[]. После этого clopenO вызывает процедуру ххореп () драйвера, в данном случае tcpopen (), передавая eй указатель на номера устройства и флаг cloneopen. В ответ на это tcpopen() генерирует неиспользуемый младший номер, создает отдельный логический драйвер (т. е. копирует необходимые структуры данных) и соответствующим образом модифицирует поле s__dev индексного дескриптора файловой системы specfs. Таким образом, для получения уникального TCP-соединения процессу нет необходимости самостоятельно производить поиск неиспользуемого младшего номера.