18.01.1999, © Igor Sysoev, igor@nitek.ru

 

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

 

Прежде всего, в ядре необходима поддержка хотя бы одного устройства ppp. В ядре FreeBSD 2.2.7 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. Два первых порта - 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 будет активен, первый процесс все равно будет заблокирован.