• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            旅途

            如果想飛得高,就該把地平線忘掉

            Linux系統(tǒng)設(shè)備管理

            設(shè)備管理是操作系統(tǒng)五大管理中最復(fù)雜的部分。與Unix系統(tǒng)一樣,Linux系統(tǒng)采用設(shè)備文件統(tǒng)一管理硬件設(shè)備,從而將硬件設(shè)備的特性及管理細節(jié)對用戶隱藏起來,實現(xiàn)用戶程序與設(shè)備無關(guān)性。在Linux系統(tǒng)中,硬件設(shè)備分為兩種,即塊設(shè)備和字符設(shè)備。

            1.特別文件

            用戶是通過文件系統(tǒng)與設(shè)備接口的,所有設(shè)備都作為特別文件,從而在管理上就具有一些共性。 (1)每個設(shè)備都對應(yīng)文件系統(tǒng)中的一個索引節(jié)點,都有一個文件名。設(shè)備的文件名一般由兩部分構(gòu)成,第一部分是主設(shè)備號,第二部分是次設(shè)備號。

            主設(shè)備號代表設(shè)備的類型,可以惟一地確定設(shè)備的驅(qū)動程序和界面,如hd表示IDE硬盤,sd表示SCSI硬盤,tty表示終端設(shè)備等;次設(shè)備號代表同類設(shè)備中的序號,如hda表示IDE主硬盤,hdb表示IDE從硬盤等。

            (2)應(yīng)用程序通常可以通過系統(tǒng)調(diào)用open( )打開設(shè)備文件,建立起與目標設(shè)備的連接。

            (3)對設(shè)備的使用類似于對文件的存取。打開設(shè)備文件以后,就可以通過read( )、write( )、ioctl( )等文件操作對目標設(shè)備進行操作。

            (4) 設(shè)備驅(qū)動程序都是系統(tǒng)內(nèi)核的一部分,它們必須為系統(tǒng)內(nèi)核或它們的子系統(tǒng)提供一個標準的接口。例如,一個終端驅(qū)動程序必須為Linux內(nèi)核提供一個文件 I/O接口;一個SCSI設(shè)備驅(qū)動程序應(yīng)該為SCSI子系統(tǒng)提供一個SCSI設(shè)備接口,同時SCSI子系統(tǒng)也應(yīng)為內(nèi)核提供文件I/O和緩沖區(qū)。

            (5)設(shè)備驅(qū)動程序利用一些標準的內(nèi)核服務(wù),如內(nèi)存分配等。另外,大多數(shù)Linux設(shè)備驅(qū)動程序都可以在需要時裝入內(nèi)核,不需要時可以卸載下來。



            圖6 設(shè)備驅(qū)動分層結(jié)構(gòu)示意圖
            圖6示出設(shè)備驅(qū)動的分層結(jié)構(gòu),從中可以看出,處于應(yīng)用層的進程通過文件描述字fd與已打開文件的file結(jié)構(gòu)相聯(lián)系。在文件系統(tǒng)層,按照文件系統(tǒng)的操作規(guī)則對該文件進行相應(yīng)處理。

            對于一般文件(即磁盤文件),要進行空間的映射—從普通文件的邏輯空間映射到設(shè)備的邏輯空間,然后在設(shè)備驅(qū)動層做進一步映射—從設(shè)備的邏輯空間映射到物理空間(即設(shè)備的物理地址空間),進而驅(qū)動底層物理設(shè)備工作。

            對于設(shè)備文件,則文件的邏輯空間通常就等價于設(shè)備的邏輯空間,然后從設(shè)備的邏輯空間映射到設(shè)備的物理空間,再驅(qū)動底層的物理設(shè)備工作。

            2.設(shè)備驅(qū)動程序和內(nèi)核之間的接口

            Linux系統(tǒng)和設(shè)備驅(qū)動程序之間使用標準的交互接口。無論是字符設(shè)備、塊設(shè)備還是網(wǎng)絡(luò)設(shè)備的驅(qū)動程序,當內(nèi)核請求它們提供服務(wù)時,都使用同樣的接口。

            Linux 提供了一種全新的機制,就是“可安裝模塊”。可安裝模塊是可以在系統(tǒng)運行時動態(tài)地安裝和拆卸的內(nèi)核模塊。利用這個機制,可以根據(jù)需要在不必對內(nèi)核重新編譯 連接的條件下,將可安裝模塊動態(tài)插入運行中的內(nèi)核,成為其中一個有機組成部分,或者從內(nèi)核卸載已安裝的模塊。設(shè)備驅(qū)動程序或與設(shè)備驅(qū)動緊密相關(guān)的部分(如 文件系統(tǒng)) 都是利用可安裝模塊實現(xiàn)的。

            在應(yīng)用程序界面上,利用內(nèi)核提供的系統(tǒng)調(diào)用來實現(xiàn)可安裝模塊的動態(tài)安裝和拆卸。但通常情況下,用戶是利用系統(tǒng)提供的插入模塊工具和移走模塊工具來裝卸可安裝模塊。插入模塊的工作主要如下:

            (1) 打開要安裝的模塊,把它讀到用戶空間。這種“模塊”就是經(jīng)過編譯但尚未連接的.o文件。

            (2) 必須把模塊內(nèi)涉及對外訪問的符號(函數(shù)名或變量名)連接到內(nèi)核,即把這些符號在內(nèi)核映像中的地址填入該模塊需要訪問這些符號的指令及數(shù)據(jù)結(jié)構(gòu)中。

            (3) 在內(nèi)核創(chuàng)建一個module數(shù)據(jù)結(jié)構(gòu),并申請所需的系統(tǒng)空間。

            (4) 最后,把用戶空間中完成了連接的模塊映像裝入內(nèi)核空間,并在內(nèi)核中“登記”本模塊的有關(guān)數(shù)據(jù)結(jié)構(gòu)(如file_operations結(jié)構(gòu)),其中有指向執(zhí)行相關(guān)操作函數(shù)的指針。

            如前所述,Linux系統(tǒng)是一個動態(tài)的操作系統(tǒng)。用戶根據(jù)工作中的需要,會對系統(tǒng)中設(shè)備重新配置,如安裝新的打印機、卸載老式終端等。這樣,每當Linux系統(tǒng)內(nèi)核初啟時,它都要對硬件配置進行檢測,很有可能會檢測到不同的物理設(shè)備,就需要不同的驅(qū)動程序。

            在構(gòu)建系統(tǒng)內(nèi)核時,可以使用配置腳本將設(shè)備驅(qū)動程序包含在系統(tǒng)內(nèi)核中。在系統(tǒng)啟動時對這些驅(qū)動程序初始化,它們可能未找到所控制的設(shè)備,而另外的設(shè)備驅(qū)動程序可以在需要時作為內(nèi)核模塊裝入到系統(tǒng)內(nèi)核中。
            為了適應(yīng)設(shè)備驅(qū)動程序動態(tài)連接的特性,設(shè)備驅(qū)動程序在其初始化時就在系統(tǒng)內(nèi)核中進行登記。Linux系統(tǒng)利用設(shè)備驅(qū)動程序的登記表作為內(nèi)核與驅(qū)動程序接口的一部分,這些表中包括指向有關(guān)處理程序的指針和其它信息。

            3.字符設(shè)備

            在Linux 系統(tǒng)中,打印機、終端等字符設(shè)備都作為字符特別文件出現(xiàn)在用戶面前。用戶對字符設(shè)備的使用就和存取普通文件一樣。在應(yīng)用程序中,使用標準的系統(tǒng)調(diào)用來打 開、關(guān)閉、讀寫字符設(shè)備。當字符設(shè)備初始化時,其設(shè)備驅(qū)動程序被添加到由device_struct結(jié)構(gòu)組成的chrdevs結(jié)構(gòu)數(shù)組中。

            device_struct 結(jié)構(gòu)由兩項構(gòu)成,一個是指向已登記的設(shè)備驅(qū)動程序名的指針,另一個是指向file_operations結(jié)構(gòu)的指針。而file_operations結(jié) 構(gòu)的成分幾乎全是函數(shù)指針,分別指向?qū)崿F(xiàn)文件操作的入口函數(shù)。設(shè)備的主設(shè)備號用來對chrdevs數(shù)組進行索引,如圖7所示。



            圖7 字符設(shè)備驅(qū)動程序示意圖


            前面講過,每個VFS索引節(jié)點都和一系列文件操作相聯(lián)系,并且這些文件操作隨索引節(jié)點所代表的文件類型不同而不同。每當一個VFS索引節(jié)點所代表的字符設(shè)備文件創(chuàng)建時,它的有關(guān)文件的操作就設(shè)置為默認的字符設(shè)備操作。

            默認的文件操作只包含一個打開文件的操作。當打開一個代表字符設(shè)備的特別文件以后,就得到相應(yīng)的VFS索引節(jié)點,其中包括該設(shè)備的主設(shè)備號和次設(shè)備號。

            利用主設(shè)備號就可以檢索chrdevs數(shù)組,進而可以找到有關(guān)此設(shè)備的各種文件操作。這樣,應(yīng)用程序中的文件操作就會映射到字符設(shè)備的文件操作調(diào)用中。

            4.塊設(shè)備

            對塊設(shè)備的存取和對文件的存取方式一樣,其實現(xiàn)機制也和字符設(shè)備使用的機制相同。Linux系統(tǒng)中有一個名為blkdevs的結(jié)構(gòu)數(shù)組,它描述了一系列在系統(tǒng)中登記的塊設(shè)備。
            數(shù)組blkdevs也使用設(shè)備的主設(shè)備號作為索引,其元素類型是device_struct結(jié)構(gòu)。該結(jié)構(gòu)中包括指向已登記的設(shè)備驅(qū)動程序名的指針和指向block_device_operations結(jié)構(gòu)的指針。

            在block_device_operations結(jié)構(gòu)中包含指向有關(guān)操作的函數(shù)指針。所以,該結(jié)構(gòu)就是連接抽象的塊設(shè)備操作與具體塊設(shè)備類型的操作之間的樞紐。

            與字符設(shè)備不一樣,塊設(shè)備有幾種類型,例如SCSI設(shè)備和IDE設(shè)備。每類塊設(shè)備都在Linux系統(tǒng)內(nèi)核中登記,并向內(nèi)核提供自己的文件操作。

            為了把各種塊設(shè)備的操作請求隊列有效地組織起來,內(nèi)核中設(shè)置了一個結(jié)構(gòu)數(shù)組blk_dev,該數(shù)組中的元素類型是blk_dev_struct結(jié)構(gòu)。這個結(jié)構(gòu)由三個成分組成,其主體是執(zhí)行操作的請求隊列request_queue,還有一個函數(shù)指針queue。

            當 這個指針不為0時,就調(diào)用這個函數(shù)來找到具體設(shè)備的請求隊列。這是考慮到多個設(shè)備可能具有同一主設(shè)備號,該指針在設(shè)備初始化時被設(shè)置好。通常當它不為0 時,還要使用該結(jié)構(gòu)中的另一個指針data,用來提供輔助性信息,幫助該函數(shù)找到特定設(shè)備的請求隊列。每一個請求數(shù)據(jù)結(jié)構(gòu)都代表一個來自緩沖區(qū)的請求。

            每當緩沖區(qū)要和一個登記過的塊設(shè)備交換數(shù)據(jù),它都會在blk_dev_struct中添加一個請求數(shù)據(jù)結(jié)構(gòu),如圖8所示。



            圖8 塊設(shè)備驅(qū)動程序數(shù)據(jù)結(jié)構(gòu)示意圖


            每 一個請求都有一個指針指向一個或多個buffer_head數(shù) 據(jù)結(jié)構(gòu),而該結(jié)構(gòu)都是一個讀寫數(shù)據(jù)塊的請求。每一個請求結(jié)構(gòu)都在一個靜態(tài)鏈表all_requests中。若干請求是添加到一個空的請求鏈表中,則調(diào)用設(shè) 備驅(qū)動程序的請求函數(shù),開始處理該請求隊列。否則,設(shè)備驅(qū)動程序就簡單地處理請求隊列中的每一個請求。

            當設(shè)備驅(qū)動程序完成了一個請求后,就把buffer_head結(jié)構(gòu)從request結(jié)構(gòu)中移走,并標記buffer_head結(jié)構(gòu)已更新,同時解鎖,這樣,就可以喚醒相應(yīng)的等待進程。

            posted on 2009-10-12 23:34 旅途 閱讀(468) 評論(0)  編輯 收藏 引用 所屬分類: LINUX基礎(chǔ)、管理

            亚洲人成伊人成综合网久久久| 国产亚洲婷婷香蕉久久精品| 亚洲国产成人久久综合区| 亚洲国产高清精品线久久| 久久精品免费一区二区| 国产婷婷成人久久Av免费高清| 99久久国产免费福利| 香蕉久久永久视频| 97超级碰碰碰久久久久| 99久久国产亚洲综合精品| 久久久精品人妻一区二区三区蜜桃| 欧美精品一本久久男人的天堂| 日韩精品久久久久久久电影| …久久精品99久久香蕉国产| 狠狠久久综合| 久久se精品一区精品二区| 欧美黑人激情性久久| 久久综合亚洲色HEZYO国产| 久久精品国产一区| 久久人人妻人人爽人人爽| 久久青青草原精品国产不卡 | 国产91久久综合| 久久久久人妻精品一区二区三区| 久久免费大片| 国内精品久久久久久久亚洲| 国产一级持黄大片99久久| 久久久噜噜噜久久熟女AA片| 亚洲精品蜜桃久久久久久| 欧美午夜精品久久久久久浪潮| 久久综合九色综合欧美狠狠| 久久久久人妻一区二区三区vr| 亚洲精品乱码久久久久久蜜桃图片| 久久久无码精品亚洲日韩蜜臀浪潮| 久久久久香蕉视频| 久久久久亚洲AV无码专区桃色| 99久久婷婷国产综合精品草原| 久久精品9988| 久久精品这里只有精99品| 久久综合久久鬼色| 久久婷婷是五月综合色狠狠| 久久精品一本到99热免费|