《Linux源碼分析報(bào)告——字符終端設(shè)備》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《Linux源碼分析報(bào)告——字符終端設(shè)備(6頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、源碼分析報(bào)告字符終端設(shè)備字符終端設(shè)備的打開(kāi)操作當(dāng)我們需要使用一個(gè)字符終端設(shè)備的時(shí)候,首先需要打開(kāi)它。而打開(kāi)這一動(dòng)作,在下面通常是由一些守護(hù)進(jìn)程所發(fā)起的,比如當(dāng)我們?cè)诘卿浀揭粋€(gè)虛終端的時(shí)候,通常是由一個(gè)進(jìn)程來(lái)打開(kāi)這個(gè)虛終端(從 的的版本開(kāi)始,開(kāi)始改用另一個(gè)較小的程序來(lái)實(shí)現(xiàn)相同的功能) ,是被進(jìn)程所發(fā)起的進(jìn)程,它完成以下的操作:. 打開(kāi)行設(shè)備并設(shè)置它們的模式;.打印出的提示符,并得到用戶(hù)名;.為用戶(hù)發(fā)起一個(gè)進(jìn)程為用戶(hù)進(jìn)行登錄()流程:我們從程序調(diào)用函數(shù)打開(kāi)一個(gè)終端設(shè)備開(kāi)始。() ();()()很簡(jiǎn)單,得到一個(gè)空閑,設(shè)置一些參數(shù),然后調(diào)用():(, )()() ;先獲得一個(gè)空閑結(jié)構(gòu);填充這個(gè)結(jié)構(gòu);調(diào)
2、用獲得設(shè)備文件的;繼續(xù)填充結(jié)構(gòu);這之中調(diào)用了 () 來(lái)執(zhí)行下層的打開(kāi)操作,下面才真正涉及到終端的()()(* ,* )、首先通過(guò)取得;注:即先取得所指向的設(shè)備的設(shè)備號(hào);再根據(jù)當(dāng)前的終端類(lèi)型生成新的主、從設(shè)備號(hào);、調(diào)用 ()函數(shù)得到結(jié)構(gòu)。把它賦給(, );()1 / 6; ;、調(diào)用檢查 是否真正表示了內(nèi)存中打開(kāi)該的。大概是出于完整性的考慮。、調(diào)用 的 ()函數(shù)。(, );具體說(shuō)來(lái),每一個(gè)不同的,有不同的執(zhí)行相應(yīng)操作的函數(shù),詳見(jiàn)附錄。、將賦給結(jié)構(gòu)。;()( ,*)本函數(shù)包括主要的的操作。本函數(shù)使用了一個(gè)來(lái)互斥操作。; 在函數(shù)的開(kāi)始調(diào)用() 進(jìn)入臨界區(qū)在函數(shù)的結(jié)尾調(diào)用()退出臨界區(qū)。為了實(shí)現(xiàn)干凈操作
3、,本函數(shù)先分配內(nèi)存,再進(jìn)行關(guān)鍵操作,若出現(xiàn)錯(cuò)誤,則先到: 區(qū),釋放出所有分配的內(nèi)存,再退出?,F(xiàn)在講述程序的操作流程。、根據(jù)設(shè)備號(hào)得到設(shè)備的結(jié)構(gòu)。();、進(jìn)入臨界區(qū)();、若該不是第一次打開(kāi),轉(zhuǎn)到( ). 否則,繼續(xù)。;();、第一次打開(kāi)的操作比較復(fù)雜。主要為申請(qǐng)?jiān)O(shè)置結(jié)構(gòu),值得注意的是 ; 表明所有的開(kāi)始都用相同的結(jié)構(gòu)。而最終都調(diào)用的讀寫(xiě)函數(shù),體現(xiàn)了只是一個(gè)虛擬終端的思想。5 、調(diào)用 中的 ()函數(shù)。6 、 ,計(jì)數(shù)。7 、退出臨界區(qū)();8 、返回。()這個(gè)函數(shù)在 中被調(diào)用。(*)設(shè)置的底層讀寫(xiě)參數(shù)(大多與讀寫(xiě)有關(guān))。如:讀寫(xiě)緩沖,結(jié)構(gòu)的參數(shù)。()2 / 6如前文所示: ( )在第四步會(huì)調(diào)用(
4、),對(duì)于不同類(lèi)型的來(lái)說(shuō),這里相應(yīng)的( )當(dāng)然也會(huì)有所不同,下面列舉了一些對(duì)應(yīng)于不同類(lèi)型的不同操作,同時(shí)我們也看到在()中會(huì)調(diào)用 () ;下面是面向不同行設(shè)備的相應(yīng)操作。對(duì)應(yīng)于不同的類(lèi)型的():;對(duì)應(yīng)于不同類(lèi)型的();如果是,則有;若為則為:的初始化詳見(jiàn)后面的說(shuō)明。;如果是串行的設(shè)備則為:;在里面:;字符終端設(shè)備的寫(xiě)操作程序中的兩個(gè)重要數(shù)據(jù)結(jié)構(gòu)*(*)();(*)(*, );(*)(*);(*)(*, , , , );(*)(*, , , );(*)(*,*, , , );(*)(*, );(*)(*, , , , );(*)(*, , , , , , );(*)(*);3 / 6(*)(*,
5、);(*)(*,*);(*)(*,*);(*)(*, );(*)(*);(*)(*);(*)(*, , , , , );(*)(*,*, );*;* , . *;*; *;()的流程我們從程序調(diào)用()開(kāi)始。調(diào)用 ()函數(shù)。()()此函數(shù)中調(diào)用具體的() 函數(shù)。();();();()(* ,* ,* ,)首先從 里面取出一個(gè)結(jié)構(gòu),得到相關(guān)的的信息,此函數(shù)中調(diào)用 ()(, , ,(*),( );(, , 最后調(diào)用 ()注:大概考慮到一次不能寫(xiě)太多字符中將字符分批輸出。反復(fù)調(diào)用傳來(lái)的函數(shù):(, , , );4 / 6這個(gè)函數(shù)其實(shí)就是,即 ()()(* ,* ,* ,)注:此函數(shù)先在的寫(xiě)等待隊(duì)列上等待
6、,等它被喚醒后,然后再進(jìn)行寫(xiě)操作。而這一函數(shù),最后實(shí)際上是會(huì)調(diào)用(, , , ); 而在此處在對(duì)應(yīng)的控制臺(tái)是時(shí),()對(duì)應(yīng)的就是里的:(* ,*,)而如果對(duì)應(yīng)的是的話(huà),那么() 對(duì)應(yīng)的應(yīng)該是:()(* ,*,)如果對(duì)應(yīng)的是串行設(shè)備的話(huà),那么()對(duì)應(yīng)的應(yīng)該是:()(* ,*,)或者里面的 () ;在此處,我們以到的輸出的分析為重點(diǎn):()里面直接調(diào)用:(, , , );();抽象的終端驅(qū)動(dòng)程序?yàn)樽址K端提供了一個(gè)一般性的接口,它通過(guò)一個(gè)特別的數(shù)據(jù)結(jié)構(gòu),里面有一些指針指向了相應(yīng)的函數(shù)來(lái)進(jìn)行進(jìn)一步操作。* ( *);定義在里面,而在里面有一個(gè)全局變量:*;()首先該過(guò)程會(huì)得到當(dāng)前的的;進(jìn)入臨界區(qū)();開(kāi)始寫(xiě)屏如果是轉(zhuǎn)義序列則進(jìn)入一個(gè)自動(dòng)機(jī),進(jìn)行翻譯,并根據(jù)轉(zhuǎn)義序列的進(jìn)行實(shí)際的動(dòng)作。最后寫(xiě)屏退出臨界區(qū)();值得注意的是其中為了識(shí)別轉(zhuǎn)義序列,使用了一個(gè)有限狀態(tài)自動(dòng)機(jī):如下圖所示:分析轉(zhuǎn)義序列的自動(dòng)機(jī)5 / 6非 ”“數(shù)字或 ”“( )( )非數(shù)字”;”中用于各種顯示功能的函數(shù):(*,*);(, );();( ,);( );( ,);(*);();( );( );以下略。6 / 6