區(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),簡稱tty
長得像臺(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,簡稱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、從底層注冊開始分析
本文先從底層注冊開始分析,根據(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)的編程接口。
基于TTY 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)行交互。它通過注冊到串口核心層,實(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)。
編輯:黃飛
?
評(píng)論