該篇主要用來分析TTY子系統的框架,TTY框架圖如下:

TTY子系統位于標準字符驅動之下,其中包括:TTY核心層,TTY線路規程,TTY驅動層。
TTY Core:該核心層主要負責控制跨越一個tty設備的數據流和數據格式,使得TTY Driver能夠以一致的方式處理 到硬件 和 出自硬件 的數據。
TTY Line Discipline:線路規程,以特殊的方式對數據進行二次加工,通常表現為協議的轉換,如:PPP和Bluetooth,以便可以虛擬的“插入”到任何tty設備。
TTY Driver:該層主要用于實現各類終端的驅動,用以控制實際硬件設備,用于收發數據。其有3種不通類型的驅動:**控制臺,串口,pty**。其中,控制臺和 pty 驅動已經被編寫進內核。
?
下面是在網上的另一個TTY框架圖,結合上圖更加方便理解:

從上往下看,最上面是應用層,其次是字符設備驅動,然后是TTY核心層,TTY驅動層。
其中,
用戶層:在用戶空間,我們操作TTY的方法就是通過open,read,write讀寫設備文件,如:/dev/tty、/dev/console等
通用字符設備驅動:對上,以字符設備驅動的形式,向應用程序提供統一接口open, read, write,以便輸入輸出數據
?
System Console Core:其主要有兩個功能:
1)向系統提供控制臺終端(Console Terminal) ,以便讓用戶登錄進行交互操作。
2)提供printk功能,以便kernel代碼進行日志輸出。
System console core模塊使用struct console結構抽象system console功能,具體的driver不需要關心console的內部邏輯,填充該接口并注冊給kernel即可。
??
?
ketnel
│???└──?driver
│???│???└──?tty
│???│???│???└──?serial??#?串口終端驅動??
│???│???│???│???└──?8250
│???│???│???│?│???├──?8250_core.c??#?8250?串口核心層???
│???│???│???│?│???├──?8250_port.c??#?8250?串口port抽象
│???│???│???│?│???├──?8250_dma.c??#?8250?dma驅動
│???│???│???│?│???├──?8250_dw.c??#?8250?device?driver抽象?
│???│???│?└──?vt???#?虛擬終端驅動
│???│???│?└──?ipwireless?#?無線終端驅動
│???│???│?└──?hvc???#?虛擬控制臺
│???│???│?├──?tty_xxx??#tty?driver?port?抽象
│???│???│?├──?n_xxx.c??#?tty?line?discipline?線路規程相關文件
serial:該目錄下為串口終端的驅動程序
hvc:hypervisor虛擬控制臺
vt:目錄下為虛擬終端的驅動程序
n_xxx.c:為線路規程的相關文件,也就是串口數據處理
tty_xxx:包括字符設備驅動的實現,ioctl等
8250_xxx:為serial Driver
?
TTY是所有終端的統稱,對于不同的終端,我們有不同的驅動程序,那么我們怎么知道當前系統中,哪個驅動被加載,哪個終端設備存在呢?
可以查看/proc/tty/drivers文件,這個文件可以包含當前存在的,不同tty驅動的列表,驅動的名字,驅動的主編號,次編號范圍,tty驅動的類型。
/dev/tty?????????????/dev/tty????????5???????0?system:/dev/tty
/dev/console?????????/dev/console????5???????1?system:console
/dev/ptmx????????????/dev/ptmx???????5???????2?system
/dev/vc/0????????????/dev/vc/0???????4???????0?system:vtmaster
usbserial????????????/dev/ttyUSB???188???0-254?serial
serial???????????????/dev/ttyS???????4???64-67?serial
pty_slave????????????/dev/pts??????136???0-255?pty:slave
pty_master???????????/dev/ptm??????128???0-255?pty:master
pty_slave????????????/dev/ttyp???????3???0-255?pty:slave
pty_master???????????/dev/pty????????2???0-255?pty:master
unknown??????????????/dev/tty????????4????1-63?console
?
所有當前注冊的以及在內核中出現的tty設備,有他們自己的子目錄 /sys/class/tty下面。
在他們
tty設備的子目錄下面的文件夾中,有一個dev文件,包含了分配給tty設備的主次編號。如果驅動程序告訴內核與tty設備相關聯的物理設備和驅動程序的位置,它就會創建回這些位置的符號鏈接。
/sys/class/tty/
|--?console
|???`--?dev
|--?ptmx
|???`--?dev
|--?tty
|???`--?dev
|--?tty0
|???`--?dev
???...?
|--?ttyS1
|???`--?dev
|--?ttyS2
|???`--?dev
|--?ttyS3
|???`--?dev
???...
|--?ttyUSB0
|???|--?dev
|???|--?device?->?../../../devices/pci0000:00/0000:00:09.0/usb3/3-1/3-1:1.0/ttyUSB0
|???`--?driver?->?../../../bus/usb-serial/drivers/keyspan_4
|--?ttyUSB1
|???|--?dev
|???|--?device?->?../../../devices/pci0000:00/0000:00:09.0/usb3/3-1/3-1:1.0/ttyUSB1
|???`--?driver?->?../../../bus/usb-serial/drivers/keyspan_4
|--?ttyUSB2
|???|--?dev
|???|--?device?->?../../../devices/pci0000:00/0000:00:09.0/usb3/3-1/3-1:1.0/ttyUSB2
|???`--?driver?->?../../../bus/usb-serial/drivers/keyspan_4
`--?ttyUSB3
????|--?dev
????|--?device?->?../../../devices/pci0000:00/0000:00:09.0/usb3/3-1/3-1:1.0/ttyUSB3
????`--?driver?->?../../../bus/usb-serial/drivers/keyspan_4
?
每個tty設備都有一個struct cdev,以便用戶空間可以訪問。
/dev/tty
/dev/console
/dev/ttyS0
?
OK,
TTY子系統框架以及目錄結構分析就先了解到此,后續分析其主要的數據結構!

