區(qū)分不同的終端類型
串行端口終端(/dev/ttySn)
串行端口終端(Serial Port Terminal)是使用計(jì)算機(jī)串行端口連接的終端設(shè)備。計(jì)算機(jī)把每個(gè)串行端口都看作是一個(gè)字符設(shè)備。
有段時(shí)間這些串行端口設(shè)備通常被稱為終端設(shè)備,因?yàn)?那時(shí)它的最大用途就是用來連接終端。這些串行端口所對(duì)應(yīng)的設(shè)備名稱是/dev/tts/0
(或/dev/ttyS0
)、/dev/tts/1
(或/dev /ttyS1
)等,設(shè)備號(hào)分別是(4,0)、(4,1)等,分別對(duì)應(yīng)于DOS系統(tǒng)下的COM1、COM2等。
若要向一個(gè)端口發(fā)送數(shù)據(jù),可以在命令行上把標(biāo) 準(zhǔn)輸出重定向到這些特殊文件名上即可。例如,在命令行提示符下鍵入:echo test > /dev/ttyS1
會(huì)把單詞”test”發(fā)送到連接在ttyS1(COM2)端口的設(shè)備上。
偽終端(/dev/pty/)
偽終端 /dev/pts
是遠(yuǎn)程登陸(telnet,ssh等)后創(chuàng)建的控制臺(tái)設(shè)備文件所在的目錄。
由于可能有好幾千個(gè)用戶登陸,所以/dev/pts
其實(shí)是動(dòng)態(tài)生成的,不象其他設(shè)備文件是構(gòu)建系統(tǒng)時(shí)就已經(jīng)產(chǎn)生的硬盤節(jié)點(diǎn)(如果未使用devfs) 。
第一個(gè)用戶登陸,console的設(shè)備文件為/dev/pts/0
,第二個(gè)為/dev/pts/1
,以此類推。這里的0、1、2、3不是具體的標(biāo)準(zhǔn)輸入或輸出,而是整個(gè)控制臺(tái)。你可嘗試 echo "aaaaaa" > /dev/pts0、1、2……
。
控制終端(/dev/tty)
控制終端 /dev/tty
指的是當(dāng)前所處的終端,輸出到此的內(nèi)容只會(huì)顯示在當(dāng)前工作的終端顯示器上。
如果當(dāng)前進(jìn)程有控制終端(Controlling Terminal)的話,那么/dev/tty就是當(dāng)前進(jìn)程的控制終端的設(shè)備特殊文件??梢允褂妹睢眕s –ax”來查看進(jìn)程與哪個(gè)控制終端相連。對(duì)于你登錄的shell,/dev/tty
就是你使用的終端,設(shè)備號(hào)是(5,0)。
使用命令”tty”可以查看它具體對(duì)應(yīng)哪個(gè)實(shí)際終端設(shè)備。/dev/tty
有些類似于到實(shí)際所使用終端設(shè)備的一個(gè)聯(lián)接。這個(gè)終端文件可以由各個(gè)用戶共享
控制臺(tái)終端(/dev/ttyn, /dev/console)
控制臺(tái)終端/dev/ttyn
n(0到6), tty1,tty2就是不同的虛擬終端(virtual console).
/dev/console
就是tty0 ,tty0則是當(dāng)前所使用虛擬終端即激活的虛擬終端的一個(gè)別名,系統(tǒng)所產(chǎn)生的信息會(huì)發(fā)送到該終端上,實(shí)際上機(jī)器只有一個(gè)屏幕,也就是我們看到的這個(gè)屏幕,可以理解為console指向激活的那個(gè)tty,準(zhǔn)確地說是激活的那個(gè)tty才將輸出顯示到console。
歷史上,console指主機(jī)本身的屏幕鍵盤,而tty指用電纜鏈接的其它位置的控制臺(tái)(僅包含屏幕和鍵盤)。tty0是系統(tǒng)自動(dòng)打開的,但不用于用戶登錄。
總結(jié)
其實(shí),上古時(shí)期,都有實(shí)體,理解完全不是難事。
這個(gè)IBM的廣告,美女左手是terminal,右手是console
terminal 相對(duì)的是console
-
-
- terminal是終端,不在主機(jī)上,遠(yuǎn)端控制console是主機(jī)上的面板開關(guān),本機(jī)控制
-
terminal是一個(gè)設(shè)備,最早借用了teletypewriter的產(chǎn)品形態(tài),簡(jiǎn)稱tty
-
-
- 長(zhǎng)得像臺(tái)打字機(jī),其實(shí)輸入輸出確實(shí)都打印在紙上后來進(jìn)化出一個(gè)crt顯示器所以上古時(shí)期,terminal包含tty,tty就是terminal的一種
-
shell相對(duì)的是kernel
-
- 那個(gè)時(shí)候有shell嘛?可能還沒有出現(xiàn)
實(shí)體terminal時(shí)代的邏輯流程圖如下:
到了PC時(shí)代,本機(jī)自帶了鍵盤鼠標(biāo),于是混亂就開始了
- 實(shí)體的terminal設(shè)備,已經(jīng)消失了,沒有打字機(jī)形態(tài)的tty,也不存在video tty但是,基因被傳承了下來,還是有terminal,tty這樣的名稱存在,并且邏輯上一以貫之shell作為kernel的中間層,也發(fā)明了出來,搞不清打開的是terminal還是shell
我們平時(shí)打開的iterm2之類的,實(shí)際上是terminal應(yīng)用
-
-
- 并不直接與shell交互,更不與kernel交互它是一個(gè)帶顯示器的遠(yuǎn)程對(duì)講機(jī),或者說是facetime,和虛擬master交互
-
實(shí)體tty不存在了,但是虛擬出一個(gè)偽終端,pseudo tty,簡(jiǎn)稱pty
-
-
- 這個(gè)pty虛擬出來一個(gè)master,你可以理解成一個(gè)坐在實(shí)體終端機(jī)前面的小人pty又虛擬出一個(gè)slave,你可以理解成上古時(shí)代的終端機(jī)
-
為什么要這樣做呢?
-
-
- 好比把之前主機(jī)的實(shí)體外設(shè),在主機(jī)內(nèi)部模擬了一下老的傳統(tǒng)被傳承了下來,設(shè)定有一個(gè)人,在敲終端機(jī)保持了系統(tǒng)的一貫性,只是各種名稱,帶來了混亂
-
master與外部terminal應(yīng)用交互,slave與shell交互,shell與kernel交互
現(xiàn)代tty架構(gòu)
串口驅(qū)動(dòng)框架
串口驅(qū)動(dòng),內(nèi)核啟動(dòng)的時(shí)候,便初始化完成,后期應(yīng)用層用到的時(shí)候,訪問設(shè)備節(jié)點(diǎn)便,獲取串口設(shè)備的 fd 句柄,然后設(shè)置相關(guān)的參數(shù)(波特率,停止位,校驗(yàn)位等等)便可以使用串口進(jìn)行數(shù)據(jù)收發(fā)。
Linux Kernel 的 UART 串口分為幾層,tty 核心層,tty 線路規(guī)程,串行驅(qū)動(dòng)核心層,以及下面對(duì)接具體芯片的 ops:
整個(gè)流程走下來,有太多的數(shù)據(jù)結(jié)構(gòu)和 ops,要分析清楚整個(gè)流程,有兩種方式:
1、至上而下,即,從用戶空間調(diào)用串口配置以及串口讀寫的角度來分析
2、從底層注冊(cè)開始分析
本文先從底層注冊(cè)開始分析,根據(jù)內(nèi)核已知提供的接口,逐步打開魔盒,力求擴(kuò)散到每一個(gè)常用的地方。
tty ?core
tty core主要實(shí)現(xiàn)如下三類功能:
- 將串口設(shè)備有關(guān)的物理對(duì)象(及其操作方法)封裝成一個(gè)一個(gè)的數(shù)據(jù)結(jié)構(gòu),以達(dá)到用軟件語言描述硬件的目的。向底層driver提供串口驅(qū)動(dòng)的編程接口?;赥TY framework所提供的TTY driver的編寫規(guī)則,將底層driver看到的serial driver,轉(zhuǎn)換為TTY driver,并將所有的serial操作,轉(zhuǎn)換為對(duì)應(yīng)的tty操作。
線路規(guī)程
負(fù)責(zé)在串口設(shè)備之間進(jìn)行上下文切換,以實(shí)現(xiàn)多任務(wù)調(diào)度。當(dāng)有數(shù)據(jù)需要從串口設(shè)備發(fā)送或接收時(shí),線程調(diào)度器會(huì)將任務(wù)切換到適當(dāng)?shù)脑O(shè)備上。
串口硬件驅(qū)動(dòng)層
這個(gè)層次主要負(fù)責(zé)和具體的串口硬件進(jìn)行通信,實(shí)現(xiàn)了對(duì)硬件的控制和訪問。在內(nèi)核中,串口驅(qū)動(dòng)模塊通常被實(shí)現(xiàn)為字符設(shè)備,通過字符設(shè)備接口與串口核心模塊進(jìn)行交互。它通過注冊(cè)到串口核心層,實(shí)現(xiàn)了對(duì)上層的透明。
小結(jié)
tty core
和串口硬件驅(qū)動(dòng)層是串口驅(qū)動(dòng)框架的核心部分。在使用串口設(shè)備時(shí),用戶通常只需要與tty core
模塊進(jìn)行交互,而不需要直接操作串口驅(qū)動(dòng)模塊和平臺(tái)驅(qū)動(dòng)模塊。下一節(jié)我們將深入到串口驅(qū)動(dòng)內(nèi)部分析tty core
的框架體系結(jié)構(gòu)。
本文參考
https://blog.csdn.net/liusaoyue/article/details/5075745
https://www.zhihu.com/question/21711307?sort=created
https://blog.csdn.net/awks4002/article/details/102360209