Код
[ 8.115418] serial8250.1: ttyS2 at MMIO 0x4c010000 (irq = 152) is a 16550A
[ 8.119578] serial8250 serial8250.1: Able to register port at index 0 (IO0 MEM4c010000 IRQ152): 2
[ 8.126439] serial8250.1: ttyS3 at MMIO 0x4c010100 (irq = 153) is a 16550A
[ 8.138429] serial8250 serial8250.1: Able to register port at index 1 (IO0 MEM4c010100 IRQ153): 3
[ 8.146460] serial8250.1: ttyS4 at MMIO 0x4c010200 (irq = 154) is a 16550A
[ 8.156863] serial8250 serial8250.1: Able to register port at index 2 (IO0 MEM4c010200 IRQ154): 4
[ 8.171341] serial8250.1: ttyS5 at MMIO 0x4c010300 (irq = 155) is a 16550A
[ 8.178412] serial8250 serial8250.1: Able to register port at index 3 (IO0 MEM4c010300 IRQ155): 5
[ 8.119578] serial8250 serial8250.1: Able to register port at index 0 (IO0 MEM4c010000 IRQ152): 2
[ 8.126439] serial8250.1: ttyS3 at MMIO 0x4c010100 (irq = 153) is a 16550A
[ 8.138429] serial8250 serial8250.1: Able to register port at index 1 (IO0 MEM4c010100 IRQ153): 3
[ 8.146460] serial8250.1: ttyS4 at MMIO 0x4c010200 (irq = 154) is a 16550A
[ 8.156863] serial8250 serial8250.1: Able to register port at index 2 (IO0 MEM4c010200 IRQ154): 4
[ 8.171341] serial8250.1: ttyS5 at MMIO 0x4c010300 (irq = 155) is a 16550A
[ 8.178412] serial8250 serial8250.1: Able to register port at index 3 (IO0 MEM4c010300 IRQ155): 5
Числа 2-5 определяют номера устройств в /dev/ttyS, к которым цепляются новые UARTs.
Однако изредка после вставки модуля один из этих ttyS вообще отваливается. Сделали такой скрипт:
Код
ls -l /dev/ttyS2; echo a2 > /dev/kmsg
ls -l /dev/ttyS3; echo a3 > /dev/kmsg
ls -l /dev/ttyS4; echo a4 > /dev/kmsg
ls -l /dev/ttyS5; echo a5 > /dev/kmsg
insmod m8_hub.ko
ls -l /dev/ttyS2; echo b2 > /dev/kmsg
ls -l /dev/ttyS3; echo b3 > /dev/kmsg
ls -l /dev/ttyS4; echo b4 > /dev/kmsg
ls -l /dev/ttyS5; echo b5 > /dev/kmsg
ls -l /dev/ttyS3; echo a3 > /dev/kmsg
ls -l /dev/ttyS4; echo a4 > /dev/kmsg
ls -l /dev/ttyS5; echo a5 > /dev/kmsg
insmod m8_hub.ko
ls -l /dev/ttyS2; echo b2 > /dev/kmsg
ls -l /dev/ttyS3; echo b3 > /dev/kmsg
ls -l /dev/ttyS4; echo b4 > /dev/kmsg
ls -l /dev/ttyS5; echo b5 > /dev/kmsg
В итоге имеем такой лог от dmesg:
Код
[ 8.013214] a2
[ 8.030402] a3
[ 8.046447] a4
[ 8.063384] a5
[ 8.098092] m8_hub: starting...
[ 8.098195] m8_hub 00:c004: adding serial ports
[ 8.098218] m8_hub 00:c004: found UART at address 0x10000, irq 24
[ 8.098239] m8_hub 00:c004: found UART at address 0x10100, irq 25
[ 8.098261] m8_hub 00:c004: found UART at address 0x10200, irq 26
[ 8.098282] m8_hub 00:c004: found UART at address 0x10300, irq 27
[ 8.098300] m8_hub 00:c004: registering serial ports
[ 8.115418] serial8250.1: ttyS2 at MMIO 0x4c010000 (irq = 152) is a 16550A
[ 8.119578] serial8250 serial8250.1: Able to register port at index 0 (IO0 MEM4c010000 IRQ152): 2
[ 8.126439] serial8250.1: ttyS3 at MMIO 0x4c010100 (irq = 153) is a 16550A
[ 8.138429] serial8250 serial8250.1: Able to register port at index 1 (IO0 MEM4c010100 IRQ153): 3
[ 8.146460] serial8250.1: ttyS4 at MMIO 0x4c010200 (irq = 154) is a 16550A
[ 8.156863] serial8250 serial8250.1: Able to register port at index 2 (IO0 MEM4c010200 IRQ154): 4
[ 8.171341] serial8250.1: ttyS5 at MMIO 0x4c010300 (irq = 155) is a 16550A
[ 8.178412] serial8250 serial8250.1: Able to register port at index 3 (IO0 MEM4c010300 IRQ155): 5
[ 8.230699] b2
[ 8.247030] b3
[ 8.258412] b4
[ 8.268520] b5
[ 8.030402] a3
[ 8.046447] a4
[ 8.063384] a5
[ 8.098092] m8_hub: starting...
[ 8.098195] m8_hub 00:c004: adding serial ports
[ 8.098218] m8_hub 00:c004: found UART at address 0x10000, irq 24
[ 8.098239] m8_hub 00:c004: found UART at address 0x10100, irq 25
[ 8.098261] m8_hub 00:c004: found UART at address 0x10200, irq 26
[ 8.098282] m8_hub 00:c004: found UART at address 0x10300, irq 27
[ 8.098300] m8_hub 00:c004: registering serial ports
[ 8.115418] serial8250.1: ttyS2 at MMIO 0x4c010000 (irq = 152) is a 16550A
[ 8.119578] serial8250 serial8250.1: Able to register port at index 0 (IO0 MEM4c010000 IRQ152): 2
[ 8.126439] serial8250.1: ttyS3 at MMIO 0x4c010100 (irq = 153) is a 16550A
[ 8.138429] serial8250 serial8250.1: Able to register port at index 1 (IO0 MEM4c010100 IRQ153): 3
[ 8.146460] serial8250.1: ttyS4 at MMIO 0x4c010200 (irq = 154) is a 16550A
[ 8.156863] serial8250 serial8250.1: Able to register port at index 2 (IO0 MEM4c010200 IRQ154): 4
[ 8.171341] serial8250.1: ttyS5 at MMIO 0x4c010300 (irq = 155) is a 16550A
[ 8.178412] serial8250 serial8250.1: Able to register port at index 3 (IO0 MEM4c010300 IRQ155): 5
[ 8.230699] b2
[ 8.247030] b3
[ 8.258412] b4
[ 8.268520] b5
То есть вроде бы все хорошо. Но реально на консоль выдается, например:
Код
crw-rw---- 1 root root 4, 66 Nov 30 00:00 /dev/ttyS2
crw-rw---- 1 root root 4, 67 Nov 30 00:00 /dev/ttyS3
crw-rw---- 1 root root 4, 68 Nov 30 00:00 /dev/ttyS4
crw-rw---- 1 root root 4, 69 Nov 30 00:00 /dev/ttyS5
crw-rw---- 1 root root 4, 66 Nov 30 00:00 /dev/ttyS2
crw-rw---- 1 root root 4, 67 Nov 30 00:00 /dev/ttyS3
ls: /dev/ttyS4: No such file or directory
crw-rw---- 1 root root 4, 69 Nov 30 00:00 /dev/ttyS5
crw-rw---- 1 root root 4, 67 Nov 30 00:00 /dev/ttyS3
crw-rw---- 1 root root 4, 68 Nov 30 00:00 /dev/ttyS4
crw-rw---- 1 root root 4, 69 Nov 30 00:00 /dev/ttyS5
crw-rw---- 1 root root 4, 66 Nov 30 00:00 /dev/ttyS2
crw-rw---- 1 root root 4, 67 Nov 30 00:00 /dev/ttyS3
ls: /dev/ttyS4: No such file or directory
crw-rw---- 1 root root 4, 69 Nov 30 00:00 /dev/ttyS5
То есть, в процессе вставки модуля /dev/ttyS4 взял и умер. При вставке модуля это происходит довольно часто, хотя конкретное устройство может быть любым от ttyS2 до ttyS5. Могут и сразу два пропасть.
Проблема в том, что после такой пропажи перестает работать софт. Однако прямой вызов вроде
Код
mknod -m 660 /dev/ttyS4 c 4 68
возвращает файл устройства на место. Пока правда не удалось проверить, работает ли само устройство после mknod.
Есть подозрение, что это как-то связано не с ядром как таковым, а с busybox. Во всяком случае эффект наблюдается с busybox версии 1.21.1 и не наблюдается с версией 1.17.
Хочется эту бяку победить, но пока не непонятно, что предпринять, чтобы выяснить причину. Может быть кто-нибудь сталкивался с похожим багом?