line discipline(LDISC) 線路規程,是linux和類unix系統終端子系統的一個軟體驅動層。終端子系統從上到下可劃分為三層:
- 頂層tty core驅動層提供字元裝置介面(因為所有的終端裝置都是字元裝置);
- 最底層是tty driver層用來和硬體進行通訊,實現tty_operations供tty core和 LDISC層調用;
- 中介層line discipline實現終端輸入輸出資料處理的策略。
line discipline把tty core和tty driver粘合在一起,策略的分離使得tty core和tty driver不需要關注資料文法處理,tty driver可以被相同的硬體複用,而只需更改line discipline。
linux終端裝置預設的線路規程是N_TTY,它從tty driver和應用程式接收資料,按照終端設定處理資料。對於輸入資料,它處理特殊的中斷字元(比如Control-C),刪除字元(backspace, delete)等等;對於輸出資料,它用CR/LF序列替換LF字元。當uart port用做普通串口時,使用N_TTY線路規程。
當uart port裝置用做serial modem 的internet撥號連線時,使用PPP線路規程處理資料;ppp LDISC把從uart core來的串口資料群組裝為PPP輸入packet,然後分發給網路通訊協定棧;ppp LDISC把從網路通訊協定棧發送來的資料拆包發送給uart port。
最初在閱讀linux tty終端系統代碼時,對LDISC非常困惑,除非想瞭解line discipline文法處理細節,完全可以越過大部分ldisc代碼。
ldisc工作於tty core和tty driver之間,ldisc需要為二者提供如下介面函數:
TTY core端介面:
open()
close()
hangup()
write()
flush_buffer()
chars_in_buffer()
set_termios()
read()
poll()
ioctl()
compat_ioctl()
TTY driver端介面:
receive_buf()
write_wakeup()
dcd_change()