Персональный
сайт
Игоря
Сысоева


 
english
обо мне
 
sysoev.ru
 
nginx
 
mod_accel
mod_realip
mod_deflate
программирование
всякая всячина
windows
freebsd
apache
pppd
unix
web
 
 

Чего pppd не хватает в ядре FreeBSD для полного счастья ?

 

18.01.1999

Прежде всего, в ядре необходима поддержка хотя бы одного устройства ppp. В ядре FreeBSD GENERIC, которое устанавливается на новую систему, одно устройство ppp присутствует. Если Вы планируете запускать одновременно несколько процессов pppd, то для каждого из них необходимо своё устройство. В файле конфигурации ядра число устройств ppp задаётся так:

pseudo-device   ppp     4
В данном примере ядро поддерживает до 4 одновременных процессов pppd.

Кроме того, поскольку pppd будет общаться с модемами через последовательные порты, необходимо, чтобы в ядре были устройства этих последовательных портов sio0, sio1 и так далее, ровно столько, сколько у Вас их есть. В файле конфигурации ядра они задаются так:

device  sio0  at isa? port "IO_COM1" tty irq 4 vector siointr
device  sio1  at isa? port "IO_COM2" tty irq 3 vector siointr
device  sio2  at isa? disable port "IO_COM3" tty irq 5 vector siointr
device  sio3  at isa? disable port "IO_COM4" tty irq 9 vector siointr

Именно так сконфигурированы последовательные порты в ядре GENERIC FreeBSD-2.2.7. Два первых порта — COM1 с прерыванием 4 и COM2 с прерыванием 3 — активны, а два оставшихся — COM3 с прерыванием 5 и COM4 с прерыванием 9 — не активны. Активизировать их и при необходимости поменять номера прерываний можно во время загрузки системы. Для этого в ответ на приглашение "boot:" нужно набрать -c. Имейте ввиду, что для всех портов необходимы разные прерывания. Одновременно работать два порта с одним прерыванием не смогут.

Впрочем, даже если Вам достаточно одного устройства, всё равно рекомендуется пересобрать ядро. О том, зачем это нужно делать и как это делается, Вы можете прочитать по-английски в FreeBSD Handbook или по-русски на странице Ивана Паскаля.

Прикладные программы общаются с последовательными портами через устройства /dev/ttyd# и /dev/cuaa#. Партия в лице man sio учит нас, что устройства ttyd# используется для входящих звонков, тогда как cuaa# для исходящих. На самом же деле, cuaa# может с успехом использоваться и для входящих звонков, что демонстрируется mgetty, а pppd умеет звонить и по ttyd#. Тем не менее, для исходящих звонков мы будем использовать только cuaa#. Основное отличие ttyd# от cuaa# состоит в том, что когда какой-либо процесс хочет открыть устройство ttyd#, происходит следующее. Этот процесс блокируется и ядро проверяет, не используется ли устройство sio# кем-то другим. После того, как другой процесс освободит устройство sio#, ядро захватывает устройство ttyd# для первого процесса. Этот процесс находится в заблокированном состоянии до тех пор, пока в последовательном порту не будет активен сигнал DCD, или, говоря по-русски, пока модемы не соединятся. После этого процесс просыпается и может писать в устройство и читать из него. Заметим, что пока этот процесс заблокирован, другие процессы могут использовать устройство cuaa# для установления соединения. В этом случае, хотя сигнал DCD будет активен, первый процесс все равно будет заблокирован.

(C) Игорь Сысоев
http://sysoev.ru