What is tty

終端是一種字元裝置(Char Device),它有多種類型,通常使用ttyTeletype)來簡稱各種類型的終端設備。Teletype是最早出現的一種終端設備,很象電傳打字機(或者說就是),是由Teletype公司生產的。設備名放在特殊檔案目錄/dev/下,終端特殊設備檔案一般有以下幾種︰

   

1.串行端口終端(/dev/ttySn

串行端口終端(Serial Port Terminal)是使用計算機串行端口連接的終端設備。計算機把每個串行端口都看作是一個字符設備。有段時間這些串行端口設備通常被稱為終端設備,因為那時它的最大用途就是用來連接終端。這些串行端口所對應的設備名稱是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev /ttyS1)等,設備號分別是(4,0)、(4,1)等,分別對應於DOS系統下的COM1COM2等。若要向一個端口發送數據,可以在命令行上把標準輸出重定向到這些特殊檔案名上即可。例如,在命令行提示符下鍵入︰echo test > /dev/ttyS1會把單字"test"發送到連接在ttyS1COM2)端口的設備上。

   

當然這些設備名稱不是固定的,標示設備最為重要的major numberminor number,然後是基於此的設備驅動程式。如:/dev/ttyAM0來代替/dev/ttyS0/dev/ttyAM1來代替/dev/ttyS1

   

2.偽終端(/dev/pty/

偽終端(Pseudo Terminal)是成對的邏輯終端設備,例如/dev/ptyp3/dev/ttyp3(或著在設備檔案系統中分別是/dev/pty/m3 /dev/pty/s3)。它們與實際物理設備並不直接相關。如果一個程式把ttyp3看作是一個串行端口設備,則它對該端口的讀/寫操作會反映在該邏輯終端設備對的另一個上面(ttyp3)。而ttyp3則是另一個程式用於讀寫操作的邏輯設備。這樣,兩個程式就可以透過這種邏輯設備進行互相交流,而其中一個使用ttyp3的程式則認為自己正在與一個串行端口進行通信。這很象是邏輯設備對之間的管道操作。

   

對於ttyp3s3),任何設計成使用一個串行端口設備的程式都可以使用該邏輯設備。但對於使用ptyp3的程式,則需要專門設計來使用ptyp3m3)邏輯設備。例如,如果某人在網上使用 telnet程式連接到你的計算機上,則telnet程式就可能會開始連接到設備ptyp2m2)上(一個偽終端端口上)。此時一個getty程式就應該營運在對應的ttyp2s2)端口上。當telnet從遠端獲取了一個字符時,該字符就會透過m2s2傳遞給getty程式,而getty程式就會透過s2m2telnet程式往網路上返回"login:"字元串訊息。這樣,登錄程式與telnet程式就透過"偽終端"進行通信。透過使用適當的軟體,就可以把兩個甚至多個偽終端設備連接到同一個物理串行端口上。在使用設備檔案系統(device filesystem)之前,為了得到大量的偽終端設備特殊檔案,HP-UX AIX等使用了比較複雜的檔案名命名模式。

   

3.控制終端(/dev/tty

如果當前進程有控制終端(Controlling Terminal)的話,那麼/dev/tty就是當前進程的控制終端的設備特殊檔案。可以使用命令"ps -ax"來檢視進程與哪個控制終端相連。對於你登錄的shell/dev/tty就是你使用的終端,設備號是(5,0)。使用命令"tty"可以檢視它具體對應哪個實際終端設備。/dev/tty有些類似於到實際所使用終端設備的一個聯接。

   

4.控制台終端(/dev/ttyn, /dev/console

UNIX系統中,計算機顯示器通常被稱為控制台終端(Console)。它仿真了類型為Linux的一種終端TERM=Linux),並且有一些設備特殊檔案與之相關聯︰tty0tty1tty2等。當你在控制台上登錄時,使用的是tty1。使用Alt+ [F1─F6]組合鍵時,我們就可以切換到tty2tty3等上面去。tty1-tty6等稱為虛擬終端,而tty0則是當前所使用虛擬終端的一個別名,系統所產生的訊息會發送到該終端上。因此不管當前正在使用哪個虛擬終端,系統信息都會發送到控制台終端上。你可以登錄到不同的虛擬終端上去,因而可以讓系統同時有幾個不同的會話期存在。只有系統或超級用戶root可以向/dev /tty0進行寫操作,

   

5.其它類型

還針對很多不同的字符設備存在有很多其它種類的終端設備特殊檔案。例如針對ISDN設備的/dev/ttyIn終端設備等。這裡不再贅述

   

Linux TTY driver,包括了一般的 console 介面,也包括了 serial driver,也就是連接到 modem 或是其他 RS232 的裝置等。現在我們來一個快速瀏覽,圖直接從 Linux Device Drivers 中偷來:

   

在這裡我們可以發現,對於 user program,他們只會接觸到 TTY core。而所有不同的各式裝置,則由 TTY line discipline 處理。以 serial driver 為例,我們可以看到整個程式的流程是這樣:

1. user program 透過 system call 呼叫 Linux kernel,對應的 functions 定義在 tty_io.c。在這裡面有定義 file_operations,也就是讀取裝置所對應到的各式功能如 readwrite 等。tty_io.c,其實就扮演了 tty core 的腳色。相關各式 data structure 可以參考 tty.h tty_driver.h 等。

2. TTY core,接著呼叫 line discipline。什麼是 line discipline?我用 Google 找到最簡單的一句話:「Line disciplines are an elegant way to use the same serial device driver to run different technologies.簡單來說,TTY core 才不管你底層是 console 還是 serial port,反正就負責跟 user program 溝通就對了,而針對各種不同裝置的程式,則從 line disipline 開始,再此之前並不分。像 serial driver line discipline 就是 n_tty.c( 不過我不清楚是否也有其他的裝置用這個 line discipline XD )

3. 接下來,才輪到的 TTY driver 啦!從 n_tty.c write_chan() 中可以看到,他會呼叫 tty->ops->write(),也就是 TTY driver 註冊後的 function pointer。這裡有個地方我覺得 kernel 寫的有點鳥,就是他註冊 TTY driver 所需的 tty_operations 的名字叫做 uart_ops,然而這也是 serial driver 中的一個 structure,代表 uart 的各種 operations,因此實在很容易把這兩個搞混啊...

4. OK,以上都是 kernel 幫大家準備好好的,那我們的 code 要放在哪?答案就是在這一層了,我們可以看到 uart_write() 內,會先到 uart_start(),最後會呼叫 port->ops->start_tx()。這個 port 代表 uart_port,也就是實際的硬體,因此我們實作的 driver functions,其實最後會連結到 port->ops,讓 serial core 可以直接呼叫。

   

轉貼來源: http://flykof.pixnet.net/blog/post/24277709-%5B%E8%BD%89%E8%BC%89%E6%95%B4%E7%90%86%5Dwhat-is-tty%3F

  

,

阿倫 發表在 痞客邦 PIXNET 留言(0) 人氣()