Файлы устройств для последовательных портов /dev/term/N и /dev/cua/N

INFODOC ID: 10579

В этом документе объясняется разница в использовании файлов устройств последовательного порта /dev/term/N и /dev/cua/N, где N - одна и та-же буква или цифра. Оба файла предназначены для доступа к одному и тому-же физическому устройству последовательного порта.

Несмотря на то, что документ в основном предназначен для пользователей Solaris 2.x (SVR4), он так-же может быть полезен для пользователей Solaris 1.x (BSD-UNIX).

Файлы устройств

Файлы в директориях /dev/term и /dev/cua на самом деле являются просто синонимами (soft-links) файлов устройств последовательного порта, которые расположены в директории /devices.

Посмотрим на вывод команды ls:

# ls -lL /dev/term/* /dev/cua/*
crw-------    1 lp     sys      29,     0 Jul  6 14:31 /dev/term/a
crw--w----    1 uucp   tty      29,     1 Mar 10 12:14 /dev/term/b
crw-rw-rw-    1 root   sys      29,131072 Jul  6 14:31 /dev/cua/a
crw-rw-rw-    1 uucp   7152     29,131073 Jul 10 12:14 /dev/cua/b
                                ^^ ^^^^^^
                                |    |
Major Device Number -------------    |
Minor Device Number ------------------

Значения, которые имеют старший номер устройства (Major Device Number) и младший номер устройства (Minor Device Number) данного файла устройства определяют свойства, которыми обладает физическое устройство последовательного порта, при доступе к нему через данный файл.

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

Значение младшего номера устройства, однако, влияет на поведение устройства. На поведение устройства также влияет связка (linking) файла с физическим устройством последовательного порта.

Для файлов устройств /dev/term/N, младший номер устройства является последовательным номером, начинающимся с нуля, и этот номер ассоциирует файл устройства с физическим последовательным портом. Для файлов устройств /dev/cua/N, младший номер устройства тот-же самый, что и для /dev/term/N, за исключением того, что его наиболее значимый бит установлен в "1". Это приводит к тому, что в Solaris 2.x (SunOS 5.x) к младшему номеру устройства добавляется 131072, а в Solaris 1.x (SunOS 4.x) добавляется 128. Причиной различия является тот факт, что длина структуры, которая представляет младший номер устройства в Solaris 2 больше, чем в Solaris 1.

В вышеприведённом выводе команды ls на системе Solaris 2.x, видно, что устройство /dev/term/b имеет старший/младший номера 29 и 1, и теперь мы уже знаем, что соответствующий файл устройства /dev/cua/b будет иметь старший номер 29 и младший номер 1 + 131072 = 131073.

Соглашения об именах файлов устройств

В действительности, имена файлов устройств условны, важны только старший и младший номера устройств. Однако, не рекомендуется изменять имена файлов устройств в Solaris 2.x, так как можно нарушить выполнение процедуры автоконфигурации системы (boot -r).

Разница между Solaris 2.x и Solaris 1.x в присвоении имён файлам устройств

Соглашения о присвоении имён файлам устройств в Solaris 2.x и Solaris 1.x слегка отличаются. Эквивалентом для /dev/term/[0123...] в Solaris 1.x являются имена /dev/tty[abcd...], а для /dev/cua/[0123...] имена /dev/cua[abcd...].

Как создаются файлы устройств?

В Solaris 2.x как /dev/term/N так и /dev/cua/N обычно создаются во время загрузки операционной системы по команде "boot -r".

В Solaris 1.x только файлы /dev/term/tty* создаются операционной системой. Системный администратор должен создать соответствующие файлы /dev/cua* используя команду mknod(8). Смотри раздел "Adding a Modem to your System" в главе 11 книги "Solaris 1.x System and Network Administration Guide".

В чём-же разница между /dev/term/N и /dev/cua/N?

Если процесс для доступа к последовательному порту использует файл /dev/term/N, то вначале операционная система проверяет: присутствует ли сигнал Data Carrier Detect (DCD). Сигнал DCD соответствует контакту номер 8 25-контактного разъёма последовательного порта. Если сигнал не присутствует, то попытка доступа процесса к последовательному порту блокируется до появления сигнала DCD. Как только появляется сигнал DCD, выполнение процесса возобновляется и ему разрешается доступ к порту. Такое поведение известно как ожидание "аппаратной несущей" (hardware carrier): процесс ждёт появление сигнала "несущей" выставляемого аппаратурой присоединённой к последовательному порту.

Это особенно полезно для модемов. Процессы ttymon/getty блокируются на порту (это можно увидеть с помощью команды truss) до того момента, когда приходящий звонок становится причиной появления сигнала DCD. В этот момент ttymon получает доступ к порту и выдаёт подсказку "login: " и запускает процесс login. Когда пользователь выходит и модем отсоединяется, сигнал DCD больше не выдаётся модемом и, в результате, когда несколько мгновений спустя запустится новый процесс ttymon/getty он также будет заблокирован до установки нового модемного соединения.

Если, с другой стороны, для доступа к последовательному порту будет использован файл /dev/cua/N, процесс немедленно получит доступ к порту невзирая на состояние сигнала DCD. Такое поведение обычно называют "программная несущая" (software carrier), так как сигнал DCD моделируется программой драйвера последовательного порта, входящей в состав ядра системы.

Это означает, что модем может использоваться как для звонка в систему, так и для звонка из системы. В этом случае процесс ttymon/getty может "висеть" на /dev/term/N и ждать ответ модема на входящий звонок, а в это время локальные пользователи системы могут использовать устройство /dev/cua/N для того, чтобы звонить из системы в те периоды времени, когда модем не используется для входящих звонков (устройство dev/cua/N не может быть доступно в то время когда используется устройство /dev/term/N и наоборот).

Программное управление сигналом "аппаратная несущая"

Устройство /dev/term/N может быть программно выставлено так, что в дальнейшем состояние сигнала DCD от устройства будет игнорироваться.

Для этого можно воспользоваться программой, написанной на С или на другом языке программирования, однако системный администратор имеет утилиту для того, чтобы сделать это во время выполнения стандартной процедуры установки терминала/модема. Программная генерация сигнала несущей "software carrier" может быть задана в процедуре установки устройства /dev/term/N, при использовании Serial Port Manager из утилиты admintool, входящей в состав Solaris версий 2.3 и выше. Обычно программная генерация сигнала несущей используется при подсоединении к последовательному порту терминала вместо модема, хотя некоторые типы терминалов могут быть по желанию сконфигурированы так, чтобы использовать аппаратный сигнал DCD.

Эквивалентной процедурой в Solaris 1.x является установка флага "local" для устройства в файле /etc/ttytab.

Однако невозможно сконфигурировать файл устройства /dev/cua/N так, чтобы использовать сигнал "аппаратной несущей", то есть, чтобы поведение этого устройства было таким-же, как поведение по умолчанию устройства /dev/term/N - блокирование доступа к порту до момента появления сигнала DCD от аппаратуры (контакт номер 8 25-контактного разъёма последовательного порта).

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


Copyright © 1996 Sun Microsystems, Inc., 2550 Garcia Ave., Mtn. View, CA 94043-1100 USA. All rights reserved.
Перевод: Copyright © 1996 Виталий Филатов (vitaly@royint.com) All Rights Reserved.