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