<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux 終端(TTY)

          共 3172字,需瀏覽 7分鐘

           ·

          2021-12-01 09:07

          TTY 是 Teletype Teletypewriter 的縮寫,原來是指電傳打字機(jī),后來這種設(shè)備逐漸鍵盤和顯示器取代。不管是電傳打字機(jī)還是鍵盤顯示器,都是作為計(jì)算機(jī)的終端設(shè)備存在的,所以 TTY 也泛指計(jì)算機(jī)的終端(terminal)設(shè)備。


          為了支持這些 TTY 設(shè)備,Linux 實(shí)現(xiàn)了一個(gè)叫做 TTY 的子系統(tǒng)。所以 TTY 既指終端,也指 Linux 的 TTY 子系統(tǒng),當(dāng)然 TTY 還有更豐富(混亂)的含義,本文試圖把它們解釋清楚。本文中演示部分使用的環(huán)境為 ubuntu 18.04。


          硬件終端 terminal(TTY)

          早期的終端(terminal) 是一臺獨(dú)立于計(jì)算機(jī)的機(jī)器(teletype 即, TTY),大概像下面的樣子:

          它終端通過線纜與計(jì)算機(jī)連接,并完成計(jì)算機(jī)的輸入輸出功能:


          現(xiàn)在物理終端實(shí)際上已經(jīng)滅絕了,我們看到的所有 TTY 都是模擬視頻終端,即軟件仿真出來的終端。可以通過 toe -a 命令查看系統(tǒng)支持的終端類型,不要奇怪,這是一個(gè)挺長的列表。


          控制臺 console

          提到終端就不能不提控制臺 console。控制臺的概念與終端含義非常相近,其實(shí)現(xiàn)在我們經(jīng)常用它們表示相同的東西,但是在計(jì)算機(jī)的早期時(shí)代,它們確實(shí)是不同的東西。


          一些數(shù)控設(shè)備(比如數(shù)控機(jī)床)的控制箱,通常會被稱為控制臺,顧名思義,控制臺就是一個(gè)直接控制設(shè)備的面板,上面有很多控制按鈕。


          在計(jì)算機(jī)里,把那套直接連接在電腦上的鍵盤和顯示器就叫做控制臺。而終端是通過串口連接上的,不是計(jì)算機(jī)自身的設(shè)備,而控制臺是計(jì)算機(jī)本身就有的設(shè)備,一個(gè)計(jì)算機(jī)只有一個(gè)控制臺。


          計(jì)算機(jī)啟動的時(shí)候,所有的信息都會顯示到控制臺上,而不會顯示到終端上。這同樣說明,控制臺是計(jì)算機(jī)的基本設(shè)備,而終端是附加設(shè)備。計(jì)算機(jī)操作系統(tǒng)中,與終端不相關(guān)的信息,比如內(nèi)核消息,后臺服務(wù)消息,都可以顯示到控制臺上,但不會顯示到終端上。比如在啟動和關(guān)閉 Linux 系統(tǒng)時(shí),我們可以在控制臺上看到很多的內(nèi)核信息(下圖來自 vSphere Client 中的 "Virtual Machine Console"):


          現(xiàn)在終端和控制臺都由硬件概念,逐漸演化成了軟件的概念。


          簡單的說,能直接顯示系統(tǒng)消息的那個(gè)終端稱為控制臺,其他的則稱為終端(控制臺也是一個(gè)終端)。或者我們在平時(shí)的使用中壓根就不區(qū)分 Linux 中的終端與控制臺。


          下面的例子是通過 /dev/console 文件向控制臺發(fā)送消息,這個(gè)這個(gè)例子我們可以看到控制臺與終端的一點(diǎn)點(diǎn)不同之處。
          打開 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è)備

          從歷史上看,終端剛開始就是終端機(jī),配有打印機(jī),鍵盤,帶有一個(gè)串口,通過串口傳送數(shù)據(jù)到主機(jī)端,然后主機(jī)處理完交給終端打印出來。電傳打字機(jī)(teletype)可以被看作是這類設(shè)備的統(tǒng)稱,因此終端也被簡稱為 TTY(teletype 的縮寫)。
          如下圖所示(下圖來自互聯(lián)網(wǎng)):


          UART 驅(qū)動
          如上圖所示,物理終端通過電纜連接到計(jì)算機(jī)上的 UART(通用異步接收器和發(fā)射器)。操作系統(tǒng)中有一個(gè) UART 驅(qū)動程序用于管理字節(jié)的物理傳輸。


          行規(guī)范
          上圖中內(nèi)核中的 Line discipline(行規(guī)范)用來提供一個(gè)編輯緩沖區(qū)和一些基本的編輯命令(退格,清除單個(gè)單詞,清除行,重新打印),主要用來支持用戶在輸入時(shí)的行為(比如輸錯(cuò)了,需要退格)。


          TTY 驅(qū)動
          TTY 驅(qū)動用來進(jìn)行會話管理,并且處理各種終端設(shè)備。

          UART 驅(qū)動、行規(guī)范和 TTY 驅(qū)動都位于內(nèi)核中,它們的一端是終端設(shè)備,另一端是用戶進(jìn)程。因?yàn)樵?Linux 下所有的設(shè)備都是文件,所以它們?nèi)齻€(gè)加在一起被稱為 "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)了軟件仿真終端,它們是運(yùn)行在內(nèi)核態(tài)的。顯示器和 vSphere Client "Virtual Machine Console" 中的 tty1-tty6 都是軟件仿真終端


          /dev/tty1-/dev/tty6 是這些仿真終端在文件系統(tǒng)中的表示,程序通過對這些文件的讀寫實(shí)現(xiàn)對仿真終端的讀寫。

          如果我們在用戶空間也進(jìn)行終端仿真,情況會變得更加靈活,下圖是 xterm 及其克隆的工作方式(下圖來自互聯(lián)網(wǎng)):


          為了便于將終端仿真移入用戶空間,同時(shí)仍保持 TTY 子系統(tǒng)(TTY 子系統(tǒng)指 TTY 驅(qū)動和行規(guī)范)的完整,偽終端被發(fā)明了出來(pseudo terminal 或 pty)。偽終端在內(nèi)核中分為兩部分,分別是 master side 和 在 TTY 驅(qū)動中實(shí)現(xiàn)的 slave side。注意上圖中的 xterm,這是一個(gè)運(yùn)行在用戶態(tài)的終端仿真程序,比如 Ubuntu Desktop 中的 GNOME Terminal:


          當(dāng)創(chuàng)建一個(gè)偽終端時(shí),會在 /dev/pts 目錄下創(chuàng)建一個(gè)設(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)中,我們可以接觸到運(yùn)行在內(nèi)核態(tài)的軟件仿真終端(tty1-tty6)

          • 通過 SSH 等方式建立的連接中使用的都是偽終端

          • 偽終端是運(yùn)行在用戶態(tài)的軟件仿真終端

          總結(jié)

          通過本文我們可以了解到,真正的硬件終端基本上已經(jīng)看不到了。在一些連接了鍵盤和顯示器的系統(tǒng)中(當(dāng)然也包括一些 vsphere 等虛擬環(huán)境),我們可以接觸到運(yù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)盤鏈接。

          歡迎點(diǎn)贊,關(guān)注,轉(zhuǎn)發(fā),在看,您的每一次鼓勵,我都將銘記于心~

          瀏覽 69
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狠狠操狠狠搞 | 一级A级片电影国产国产国产国产国产 | 日本女人高潮视频 | 看免费的黄色大片 | 欧美性成人|