Fedora 16 직렬의 버퍼 오버플로

Fedora 16 직렬의 버퍼 오버플로

Fedora 16과 직렬 포트에 문제가 있습니다.

저는 제가 개발 중인 셋톱박스를 모니터링하기 위해 직렬 포트를 사용하고 있습니다. STB는 Linux에서 실행되며 시작 시 직렬 인터페이스를 통해 작업 중인 프로그램을 시작합니다.

이제 내 프로그램은 디버깅할 때 buffer overrun그리고 dmesg.

직렬 출력을 읽을 수 없게 되므로 애플리케이션 디버깅이 엉망이 됩니다.

그래서 나를 괴롭히는 것은 Fedora 15에서 실행할 때 버퍼 오버플로가 발생하지 않는다는 것입니다.별말씀을요!

내 설정에 대한 자세한 내용은 다음과 같습니다.

  • Fedora Core 16은 Cinnamon/gnome-terminal에서 직렬로 사용됩니다. 이름:3.2.6-3.fc16.x86_64
  • 직렬 포트를 연결하려면 다음 명령을 사용합니다.screen -R -d -t "Serial" /dev/ttyS0 115200

이 문제를 어떻게 해결할 수 있는지 아시나요?

(자세한 내용은:)

$ cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:3395 rx:11899157 fe:6 brk:4 oe:3496 RTS|DTR
###                                                               ^^^^^^^
###                                                            overflow errors
1: uart:16550A port:0000EC98 irq:17 tx:32 rx:0 CTS|DSR|CD
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3

일반적인 dmegs 출력:

[370425.080452] ttyS0: 24 input overrun(s)
[370426.092382] ttyS0: 30 input overrun(s)
[370427.109291] ttyS0: 36 input overrun(s)
[370428.173344] ttyS0: 28 input overrun(s)
[370429.583198] ttyS0: 26 input overrun(s)
[370430.638700] ttyS0: 32 input overrun(s)

:( :( :(

출력 sudo setserial -v -a -g /dev/ttyS0:

/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
    Baud_base: 115200, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal skip_test low_latency

답변1

Fedora 16 문서에 따르면/etc/rc.serial직렬 회선 설정을 담당합니다.

버전 15와 버전 16 설치 사이에 변경 사항이 있습니까?

"낮은 대기 시간" 및 "rx/tx_trigger"(가능한 경우)를 설정하는 것이 도움이 될 수 있습니다.

16550A에는 15바이트 입력 버퍼가 있었던 것으로 기억합니다. 인터럽트가 생성되는 패딩 수준을 어떻게든 설정할 수 있습니다. 저는 안정성과 속도를 절충하기 위해 7바이트를 사용했습니다(DOS 사용). 아마도 rx/tx-trigger도 비슷하게 조정될 것입니다.

2012년 3월 12일 업데이트됨:

방금 내 워크스테이션을 확인했습니다(CentOS5 - Fedora와 비슷해야 함).

rpm -qd setserial사용 가능한 문서를 표시합니다. Readme 파일과 예제가 있습니다.rc.직렬설명서 - Readme 파일을 참조하세요.

그 외에는 - 귀하의 결과를 다시 살펴보았습니다.정상 속도나는 안 좋아 보인다. 115kb를 원하므로 설정해야 합니다.spd_vhi(man setserial 참조) 그 이유는 UART 표준이 그 이상을 허용하지 않기 때문에 요청한 크기가 38.4kb를 초과할 수 없기 때문입니다. 나중에는 57.6kb, 그 다음에는 115kb였습니다. 이러한 속도도 설정하려면 "트릭"이 있어야 합니다.

답변2

비슷한 문제가 발생했습니다. 가동 중단 시간을 두고 경쟁하는 다른 장치로부터 이를 격리할 수 있었습니다. 제 경우에는 노트북의 SD 카드 리더기가 직렬 장치와 시간을 놓고 경쟁하고 있었습니다. 카드 리더 드라이버(rmmod)를 비활성화했더니 오버런이 사라졌습니다. 다음을 사용하여 동일한 IRQ에 있는 장치를 볼 수 있습니다: cat /proc/interrupts

관련 정보