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端接口: