TTY子系統(tǒng)初探,你學(xué)會(huì)了嗎?
一、TTY子系統(tǒng)介紹
1、TTY介紹
TTY,一詞源于Teleprinter,譯為電傳打印機(jī),在早起用來表示電腦終端的設(shè)備。
現(xiàn)在我們通常使用TTY,是各種(物理/虛擬)終端的統(tǒng)稱!
Linux系統(tǒng)的終端設(shè)備一般分為控制臺(tái)終端、偽終端、串口終端和其他類型四種。
下面我們來進(jìn)一步了解這些Linux下常用的終端,為學(xué)習(xí)Linux TTY Framework打下基礎(chǔ)!
2、控制臺(tái)終端
控制臺(tái)終端包括:系統(tǒng)控制臺(tái)、當(dāng)前控制臺(tái)、虛擬控制臺(tái)。
2.1 系統(tǒng)控制臺(tái)
系統(tǒng)控制臺(tái),也就是我們Linux下面的/dev/console,是與操作系統(tǒng)交互的設(shè)備,系統(tǒng)所產(chǎn)生的信息會(huì)發(fā)送到該設(shè)備上。
目前只有在單用戶模式下,才允許用戶登錄控制臺(tái)/dev/console。
console有緩沖的概念,為內(nèi)核提供打印輸出。內(nèi)核把要打印的內(nèi)容裝入緩沖區(qū)__log_buff,然后由console指向某個(gè)激活的終端,來決定打印到哪里。console指向激活的終端。
比如,我們在啟動(dòng)內(nèi)核的時(shí)候,傳入的參數(shù)cnotallow=ttyS1,將控制臺(tái)終端指向ttyS1串口設(shè)備。
2.2 當(dāng)前控制臺(tái)
這是應(yīng)用程序中的概念,如果當(dāng)前進(jìn)程有控制終端(Controlling Terminal),那么/dev/tty就是當(dāng)前進(jìn)程控制臺(tái)的設(shè)備文件。
對于登錄的Shell,/dev/tty就是你正在使用的控制臺(tái),設(shè)備號(5,0),/dev/tty會(huì)映射到當(dāng)前設(shè)備(使用命令tty可以查看它具體對應(yīng)哪個(gè)實(shí)際物理控制臺(tái)設(shè)備),輸出到/dev/tty的內(nèi)容只會(huì)顯示在當(dāng)前工作終端上。
你可以輸入命令tty,顯示當(dāng)前映射的實(shí)際終端如:/dev/tty1或者/dev/pts/0等。
2.3 虛擬控制臺(tái)
/dev/ttyn是進(jìn)程虛擬控制臺(tái),他們共享同一個(gè)真實(shí)的物理控制臺(tái)。
在PC上,用戶可以使用Ctrl + Alt + Fn切換,這種虛擬控制臺(tái)對應(yīng)tty1~n,其中:/dev/tty1代表第1個(gè)虛擬控制臺(tái);當(dāng)使用Ctrl + ALT+F2進(jìn)行切換時(shí),系統(tǒng)的虛擬控制臺(tái)為/dev/tty2 ,當(dāng)前控制臺(tái)(/dev/tty)則指向/dev/tty2
而比較特殊的是/dev/tty0,他代表當(dāng)前虛擬控制臺(tái),其實(shí)就是當(dāng)前所使用虛擬控制臺(tái)的一個(gè)別名。因此不管當(dāng)前正在使用哪個(gè)虛擬控制臺(tái)(注意:這里是虛擬控制臺(tái),不包括偽終端),系統(tǒng)信息都會(huì)重定位到/dev/tty0上。
只有系統(tǒng)或超級用戶root可以向/dev/tty0進(jìn)行寫操作。tty0是系統(tǒng)自動(dòng)打開的,但不用于用戶登錄
3、偽終端
偽終端(Pseudo Terminal)是終端的發(fā)展,它多用于模擬終端程序,是遠(yuǎn)程登陸(telnet、ssh、xterm等)后創(chuàng)建的控制臺(tái)設(shè)備。
它是成對出現(xiàn)的邏輯終端設(shè)備(即master和slave設(shè)備, 對master的操作會(huì)反映到slave上)。簡單說主終端和類似sshd,telnetd等用戶空間的遠(yuǎn)程協(xié)議處理進(jìn)程連接,而從終端則和shell之類的實(shí)際進(jìn)程連接。
4、串口終端
串行端口終端(Serial Port Terminal)是使用計(jì)算機(jī)串行端口連接的終端設(shè)備。計(jì)算機(jī)把每個(gè)串行端口都看作是一個(gè)字符設(shè)備。所以這些串行端口所對應(yīng)的設(shè)備名稱是/dev/ttyS0、/dev/ttyS1等,設(shè)備號分別是(4,0)、(4,1)等
若要向一個(gè)端口發(fā)送數(shù)據(jù),可以在命令行上把標(biāo)準(zhǔn)輸出重定向到這些特殊文件名上即可。
我們可以在命令行提示符下鍵入:echo "tekkaman" > /dev/ttyS1會(huì)把“tekkaman”發(fā)送到連接在ttyS1(COM2)端口的設(shè)備上。
在2.6以后的內(nèi)核后,一些三星的芯片將串口終端設(shè)備節(jié)點(diǎn)命名為ttySACn。
TI的Omap系列芯片從2.6.37開始,芯片自帶的UART設(shè)備開始使用專有的的omap-uart驅(qū)動(dòng),故設(shè)備節(jié)點(diǎn)命名為ttyOn,以區(qū)別于使用8250驅(qū)動(dòng)時(shí)的設(shè)備名“ttySn”。
5. 其它類型
還針對很多不同的字符設(shè)備存在有很多其它種類的終端設(shè)備特殊文件,例如針對ISDN設(shè)備的**/dev/ttyIn**終端設(shè)備等。
??https://blog.csdn.net/liangzc1124/article/details/127469767??