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