Linux 终端(TTY)
TTY 是 Teletype 或 Teletypewriter 的縮寫,原來是指電傳打字機,后來這種設(shè)備逐漸鍵盤和顯示器取代。不管是電傳打字機還是鍵盤顯示器,都是作為計算機的終端設(shè)備存在的,所以 TTY 也泛指計算機的終端(terminal)設(shè)備。
為了支持這些 TTY 設(shè)備,Linux 實現(xiàn)了一個叫做 TTY 的子系統(tǒng)。所以 TTY 既指終端,也指 Linux 的 TTY 子系統(tǒng),當(dāng)然 TTY 還有更豐富(混亂)的含義,本文試圖把它們解釋清楚。本文中演示部分使用的環(huán)境為 ubuntu 18.04。
硬件終端 terminal(TTY)
早期的終端(terminal) 是一臺獨立于計算機的機器(teletype 即, TTY),大概像下面的樣子:
它終端通過線纜與計算機連接,并完成計算機的輸入輸出功能:
現(xiàn)在物理終端實際上已經(jīng)滅絕了,我們看到的所有 TTY 都是模擬視頻終端,即軟件仿真出來的終端。可以通過 toe -a 命令查看系統(tǒng)支持的終端類型,不要奇怪,這是一個挺長的列表。
控制臺 console
提到終端就不能不提控制臺 console。控制臺的概念與終端含義非常相近,其實現(xiàn)在我們經(jīng)常用它們表示相同的東西,但是在計算機的早期時代,它們確實是不同的東西。
一些數(shù)控設(shè)備(比如數(shù)控機床)的控制箱,通常會被稱為控制臺,顧名思義,控制臺就是一個直接控制設(shè)備的面板,上面有很多控制按鈕。
在計算機里,把那套直接連接在電腦上的鍵盤和顯示器就叫做控制臺。而終端是通過串口連接上的,不是計算機自身的設(shè)備,而控制臺是計算機本身就有的設(shè)備,一個計算機只有一個控制臺。
計算機啟動的時候,所有的信息都會顯示到控制臺上,而不會顯示到終端上。這同樣說明,控制臺是計算機的基本設(shè)備,而終端是附加設(shè)備。計算機操作系統(tǒng)中,與終端不相關(guān)的信息,比如內(nèi)核消息,后臺服務(wù)消息,都可以顯示到控制臺上,但不會顯示到終端上。比如在啟動和關(guān)閉 Linux 系統(tǒng)時,我們可以在控制臺上看到很多的內(nèi)核信息(下圖來自 vSphere Client 中的 "Virtual Machine Console"):
現(xiàn)在終端和控制臺都由硬件概念,逐漸演化成了軟件的概念。
簡單的說,能直接顯示系統(tǒng)消息的那個終端稱為控制臺,其他的則稱為終端(控制臺也是一個終端)。或者我們在平時的使用中壓根就不區(qū)分 Linux 中的終端與控制臺。
下面的例子是通過 /dev/console 文件向控制臺發(fā)送消息,這個這個例子我們可以看到控制臺與終端的一點點不同之處。
打開 vSphere Client 中的 "Virtual Machine Console"(即控制臺),默認(rèn)顯示的是 tty1:
通過其他的終端向 /dev/console 中寫入字符串 "hello world":
root@esearch:~# echo "hello world" > /dev/console
字符串顯示在了控制臺中。然后通過 Ctrl + Alt + F2 把控制臺中的終端切換到 tty2,再次向 /dev/console 寫入字符串:
root@esearch:~# echo "hello world" > /dev/console
這次字符串寫到了 tty2 中,這說明 Linux 總是把寫入 /dev/console 的內(nèi)容會顯示在控制臺中當(dāng)前的虛擬終端(tty1-tty6)里。
TTY 設(shè)備
從歷史上看,終端剛開始就是終端機,配有打印機,鍵盤,帶有一個串口,通過串口傳送數(shù)據(jù)到主機端,然后主機處理完交給終端打印出來。電傳打字機(teletype)可以被看作是這類設(shè)備的統(tǒng)稱,因此終端也被簡稱為 TTY(teletype 的縮寫)。
如下圖所示(下圖來自互聯(lián)網(wǎng)):
UART 驅(qū)動
如上圖所示,物理終端通過電纜連接到計算機上的 UART(通用異步接收器和發(fā)射器)。操作系統(tǒng)中有一個 UART 驅(qū)動程序用于管理字節(jié)的物理傳輸。
行規(guī)范
上圖中內(nèi)核中的 Line discipline(行規(guī)范)用來提供一個編輯緩沖區(qū)和一些基本的編輯命令(退格,清除單個單詞,清除行,重新打印),主要用來支持用戶在輸入時的行為(比如輸錯了,需要退格)。
TTY 驅(qū)動
TTY 驅(qū)動用來進行會話管理,并且處理各種終端設(shè)備。
UART 驅(qū)動、行規(guī)范和 TTY 驅(qū)動都位于內(nèi)核中,它們的一端是終端設(shè)備,另一端是用戶進程。因為在 Linux 下所有的設(shè)備都是文件,所以它們?nèi)齻€加在一起被稱為 "TTY 設(shè)備",即我們常說的 TTY。
從軟件仿真終端到偽終端
后來的終端慢慢演變成了鍵盤 + 顯示器。如果我們要把內(nèi)容輸出到顯示器,只要把這些內(nèi)容寫入到顯示器對應(yīng)的 TTY 設(shè)備就可以了,然后由 TTY 層負(fù)責(zé)匹配合適的驅(qū)動完成輸出,這也是 Linux 控制臺的工作原理(下圖來自互聯(lián)網(wǎng)):
上圖中,TTY 驅(qū)動和行規(guī)范的行為與前面的示例類似,但不再有 UART 或物理終端。相反,軟件仿真出視頻終端,并最終被渲染到 VGA 顯示器。注意,這里出現(xiàn)了軟件仿真終端,它們是運行在內(nèi)核態(tài)的。顯示器和 vSphere Client "Virtual Machine Console" 中的 tty1-tty6 都是軟件仿真終端:
/dev/tty1-/dev/tty6 是這些仿真終端在文件系統(tǒng)中的表示,程序通過對這些文件的讀寫實現(xiàn)對仿真終端的讀寫。
如果我們在用戶空間也進行終端仿真,情況會變得更加靈活,下圖是 xterm 及其克隆的工作方式(下圖來自互聯(lián)網(wǎng)):
為了便于將終端仿真移入用戶空間,同時仍保持 TTY 子系統(tǒng)(TTY 子系統(tǒng)指 TTY 驅(qū)動和行規(guī)范)的完整,偽終端被發(fā)明了出來(pseudo terminal 或 pty)。偽終端在內(nèi)核中分為兩部分,分別是 master side 和 在 TTY 驅(qū)動中實現(xiàn)的 slave side。注意上圖中的 xterm,這是一個運行在用戶態(tài)的終端仿真程序,比如 Ubuntu Desktop 中的 GNOME Terminal:
當(dāng)創(chuàng)建一個偽終端時,會在 /dev/pts 目錄下創(chuàng)建一個設(shè)備文件:
如果是通過 PuTTY 等終端仿真程序通過 SSH 的方式遠(yuǎn)程連接 Linux,那么終端仿真程序通過 SSH 與 PTY master side 交換數(shù)據(jù)。
終端與偽終端的區(qū)別
至此我們可以得出這樣的結(jié)論:現(xiàn)在所說的終端已經(jīng)不是硬件終端了,而是軟件仿真終端(終端模擬軟件)。
關(guān)于終端和偽終端,可以簡單的理解如下:
真正的硬件終端基本上已經(jīng)看不到了,現(xiàn)在所說的終端、偽終端都是軟件仿真終端(即終端模擬軟件)
一些連接了鍵盤和顯示器的系統(tǒng)中,我們可以接觸到運行在內(nèi)核態(tài)的軟件仿真終端(tty1-tty6)
通過 SSH 等方式建立的連接中使用的都是偽終端
偽終端是運行在用戶態(tài)的軟件仿真終端
總結(jié)
通過本文我們可以了解到,真正的硬件終端基本上已經(jīng)看不到了。在一些連接了鍵盤和顯示器的系統(tǒng)中(當(dāng)然也包括一些 vsphere 等虛擬環(huán)境),我們可以接觸到運行在內(nèi)核態(tài)的軟件仿真終端。而我們使用最多的則是偽終端。
本文參考:
https://www.cnblogs.com/sparkdev/p/11460821.html
侵權(quán)刪
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
關(guān)注公眾號,后臺回復(fù)「1024」獲取學(xué)習(xí)資料網(wǎng)盤鏈接。
歡迎點贊,關(guān)注,轉(zhuǎn)發(fā),在看,您的每一次鼓勵,我都將銘記于心~
總結(jié)
以上是生活随笔為你收集整理的Linux 终端(TTY)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PDF资源合集
- 下一篇: 自己动手实现一个malloc内存分配器