Файлы устройств для последовательных портов /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-контактного разъёма последовательного порта).
Ещё раз подчеркнём, что только значение младшего номера устройства, но не имя файла устройства, выбираемое
только по соглашению, определяет - будет ли порт иметь программную или аппаратную генерацию несущей.