linux設(shè)備模型之tty驅(qū)動(dòng)架構(gòu)分析

linux設(shè)備模型之tty驅(qū)動(dòng)架構(gòu)分析

ID:17618736

大?。?53.50 KB

頁數(shù):15頁

時(shí)間:2018-09-03

linux設(shè)備模型之tty驅(qū)動(dòng)架構(gòu)分析_第1頁
linux設(shè)備模型之tty驅(qū)動(dòng)架構(gòu)分析_第2頁
linux設(shè)備模型之tty驅(qū)動(dòng)架構(gòu)分析_第3頁
linux設(shè)備模型之tty驅(qū)動(dòng)架構(gòu)分析_第4頁
linux設(shè)備模型之tty驅(qū)動(dòng)架構(gòu)分析_第5頁
資源描述:

《linux設(shè)備模型之tty驅(qū)動(dòng)架構(gòu)分析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫

1、Linux設(shè)備模型之tty驅(qū)動(dòng)架構(gòu)分析------------------------------------------本文系本站原創(chuàng),歡迎轉(zhuǎn)載!轉(zhuǎn)載請(qǐng)注明出處:http://ericxiao.cublog.cn/------------------------------------------一:前言Tty這個(gè)名稱源于電傳打字節(jié)的簡稱。在linux表示各種終端。終端通常都跟硬件相對(duì)應(yīng)。比如對(duì)應(yīng)于輸入設(shè)備鍵盤鼠標(biāo)。輸出設(shè)備顯示器的控制終端和串口終端.也有對(duì)應(yīng)于不存在設(shè)備的pty驅(qū)動(dòng)。在如此眾多的終

2、端模型之中,linux是怎么將它們統(tǒng)一建模的呢?這就是我們今天要討論的問題.二:tty驅(qū)動(dòng)概貌Tty架構(gòu)如下所示:如上圖所示,用戶空間主要是通過設(shè)備文件同tty_core交互.tty_core根據(jù)用空間操作的類型再選擇跟linediscipline和tty_driver交互.例如設(shè)置硬件的ioctl指令就直接交給tty_driver處理。Read和write操作就會(huì)交給linediscipline處理.Linediscipline是線路規(guī)程的意思。正如它的名字一樣,它表示的是這條終端”線程”的輸入與輸

3、出規(guī)范設(shè)置.主要用來進(jìn)行輸入/輸出數(shù)據(jù)的預(yù)處理。處理之后。就會(huì)將數(shù)據(jù)交給tty_driverTty_driver就是終端對(duì)應(yīng)的驅(qū)動(dòng)了。它將字符轉(zhuǎn)換成終端可以理解的字串.將其傳給終端設(shè)備。值得注意的是,這個(gè)架構(gòu)沒有為tty_drivero提供read操作。也就是說tty_core?和linediscipline都沒有辦法從tty_driver里直接讀終端信息。這是因?yàn)閠ty_driver對(duì)就的hardware并不一定是輸入數(shù)據(jù)和輸出數(shù)據(jù)的共同負(fù)載者。例如控制終端,輸出設(shè)備是顯示器。輸入設(shè)備是鍵盤。基于這

4、樣的原理。在linediscipline中有一個(gè)輸入緩存區(qū)。并提供了一個(gè)名叫receive_buf()的接口函數(shù)。對(duì)應(yīng)的終端設(shè)備只要調(diào)用linediscipine的receiver_buf函數(shù),將數(shù)據(jù)寫入到輸入緩存區(qū)就可以了。如果一個(gè)設(shè)備同時(shí)是輸入設(shè)備又是輸出設(shè)備。那在設(shè)備的中斷處理中調(diào)用receive_buf()將數(shù)據(jù)寫入即可.?三:tty驅(qū)動(dòng)接口分析具體的tty驅(qū)動(dòng)設(shè)計(jì)可以參考LDD3。這里只對(duì)它的接口實(shí)現(xiàn)做一個(gè)分析.ttydriver的所有操作都包含在tty_driver中。內(nèi)核即供了一個(gè)名叫a

5、lloc_tty_driver()來分配這個(gè)tty_driver。當(dāng)然我們也可以在自己的驅(qū)動(dòng)中將它定義成一個(gè)靜態(tài)的結(jié)構(gòu)。對(duì)tty_driver進(jìn)行一些必要的初始化之后,調(diào)用tty_register_driver()將其注冊(cè).alloc_tty_driver()接口代碼如下所示:15structtty_driver*alloc_tty_driver(intlines){????????structtty_driver*driver;?????????driver=kzalloc(sizeof(struc

6、ttty_driver),GFP_KERNEL);????????if(driver){??????????????????driver->magic=TTY_DRIVER_MAGIC;??????????????????driver->num=lines;??????????????????/*laterwe'llmoveallocationoftableshere*/????????}????????returndriver;}這個(gè)函數(shù)只有一個(gè)參數(shù)。這個(gè)參數(shù)的含義為line的個(gè)數(shù)。也即次設(shè)備號(hào)的個(gè)

7、數(shù)。注意每個(gè)設(shè)備文件都會(huì)對(duì)應(yīng)一個(gè)line.在這個(gè)接口里為tty_driver分配內(nèi)存,然后將driver->mage.driver->num初始化之后就返回了.?tty_register_driver()用來注冊(cè)一個(gè)tty_driver。代碼如下:inttty_register_driver(structtty_driver*driver){????????interror;????????inti;????????dev_tdev;????????void**p=NULL;?????????//TT

8、Y_DRIVER_INSTALLED:已安裝的????????if(driver->flags&TTY_DRIVER_INSTALLED)??????????????????return0;?????????//TTY_DRIVER_DEVPTS_MEM:使用devpts進(jìn)行動(dòng)態(tài)內(nèi)存映射????????if(!(driver->flags&TTY_DRIVER_DEVPTS_MEM)&&driver->num){??????????????????p=k

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。