1231.Linux環(huán)境下虛擬文件系統(tǒng)分析研究_第1頁
1231.Linux環(huán)境下虛擬文件系統(tǒng)分析研究_第2頁
1231.Linux環(huán)境下虛擬文件系統(tǒng)分析研究_第3頁
1231.Linux環(huán)境下虛擬文件系統(tǒng)分析研究_第4頁
1231.Linux環(huán)境下虛擬文件系統(tǒng)分析研究_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 本科生畢業(yè)論文(設(shè)計(jì))本科生畢業(yè)論文(設(shè)計(jì)) 題 目 linux 環(huán)境下虛擬文件系統(tǒng) 分析研究 學(xué)生姓名 指導(dǎo)教師 學(xué) 院 專業(yè)班級 完成時(shí)間2006 年 6 月 目錄 摘要.i abstract.ii 第一章 緒論.1 1.1 課題來源及研究背景 .1 1.1.1 虛擬文件系統(tǒng)概述.1 1.1.2 linux 研究現(xiàn)狀.1 1.2 課題研究的目的和意義 .2 第二章 總體規(guī)劃.4 2.1 設(shè)計(jì)思路 .4 2.2 實(shí)施方案 .6 第三章 對虛擬文件系統(tǒng)的分析 .8 3.1 虛擬文件系統(tǒng)數(shù)據(jù)結(jié)構(gòu) .8 3.1.1 超級塊.8 3.1.2 索引節(jié)點(diǎn).11 3.1.3 文件.15 3.2 文件系統(tǒng)

2、高速緩存 .17 3.2.1 緩沖區(qū)高速緩存.17 3.2.2 目錄項(xiàng)高速緩存.18 3.2.3 索引節(jié)點(diǎn)高速緩存.19 3.3 掛載文件系統(tǒng) .20 3.3.1 注冊文件系統(tǒng).20 3.3.2 裝配文件系統(tǒng).20 3.4 卸載文件系統(tǒng) .21 第四章 系統(tǒng)詳細(xì)設(shè)計(jì).23 4.1 配置和編譯 linux 內(nèi)核.23 4.2 制作根文件系統(tǒng) .26 4.3 制作 grub 引導(dǎo) .28 4.4 配置并安裝 busybox .30 4.5 向 busybox 中添加自己書寫的命令 .32 4.6 制作內(nèi)存磁盤映象文件 (ramdisk).34 4.7 運(yùn)行與調(diào)試 .36 第五章 總結(jié)與展望.40

3、5.1 總結(jié) .40 5.2 設(shè)計(jì)收獲 .40 致謝.41 參考文獻(xiàn).42 摘要 本文在對linux內(nèi)核源代碼進(jìn)行深入分析的基礎(chǔ)上,對linux的虛擬 文件系統(tǒng)的內(nèi)部實(shí)現(xiàn)機(jī)制進(jìn)行研究,著重闡述linux虛擬文件系統(tǒng)是如 何支持各種實(shí)際的物理文件系統(tǒng),最后從實(shí)踐的角度說明,如何將虛擬 文件系統(tǒng)模塊從linux內(nèi)核中剝離出來,并對剝離出來的部分進(jìn)行適當(dāng) 修改,編寫一些為之服務(wù)的實(shí)用程序,使之成為一個(gè)可以脫離其他操作 系統(tǒng)而獨(dú)立運(yùn)行的小型系統(tǒng)。該系統(tǒng)的作用是管理文件系統(tǒng)和協(xié)調(diào)多種 文件系統(tǒng)之間的共存。在具體實(shí)施過程中,采用過程分析的方法,通過 對虛擬文件系統(tǒng)中文件操作過程和文件訪問過程的深入研究,抽

4、象出 linux的虛擬文件系統(tǒng)的工作方式和主要數(shù)據(jù)結(jié)構(gòu),總結(jié)出linux虛擬文 件系統(tǒng)相對于其他操作系統(tǒng)中文件系統(tǒng)的優(yōu)點(diǎn),以此達(dá)到更好地認(rèn)識虛 擬文件系統(tǒng)。通過研究虛擬文件系統(tǒng),可以達(dá)到掌握其設(shè)計(jì)思想,進(jìn)而 改進(jìn)的目的。 關(guān)關(guān)鍵鍵詞詞 虛擬文件系統(tǒng),目錄項(xiàng),索引節(jié)點(diǎn) abstract based on the deeply analysis of linux kernel source code,this article gives the research int the realization mechanism of the virtual file system switch(vfs)

5、 of linux and especially explaines how the vfs supports lots kinds of real file system.and then, it explaines how to separate the virtual file system form linux kernel and complement it with some modifications and program some utilities so as this new tiny system can run with out any other operating

6、 system. this systems purpose is to manage file system and coordinate their co-existence.during the deeply research,the article summarizes some merits in its working way and the main data structure of vfs of linux from the analysis of file access course and file operation course with the method of c

7、ourse analysis.through the research, we can know the characteristics of designing vfs,and improve it. key words virtual file system switch(vfs),dentry,inod 第一章 緒論 1.1 課題來源及研究背景 1.1.1 虛擬文件系統(tǒng)概述 linux 虛擬文件系統(tǒng):虛擬的概念是指它的所有數(shù)據(jù)結(jié)構(gòu)都是在運(yùn)行以后在內(nèi)存 中間建立的,并在卸載時(shí)刪除,在磁盤上并沒有存儲相應(yīng)的數(shù)據(jù)結(jié)構(gòu)。以之相對應(yīng) 的是具體的文件系統(tǒng),ext2 ,minix ,msdos,vfa

8、t 等文件系統(tǒng)。虛擬文件系統(tǒng)是操作系 統(tǒng)與實(shí)際文件系統(tǒng)的一個(gè)接口層1。它在操作系統(tǒng)中起到了很重要的作用,概括起 來有以下幾點(diǎn): 對具體文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)進(jìn)行抽象,以一種統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)進(jìn)行管理。 接受用戶層的系統(tǒng)調(diào)用,例如:write open stat link 等。 支持多種具體文件系統(tǒng)之間的相互訪問。 接受內(nèi)核其他子系統(tǒng)的操作請求,例如內(nèi)存管理,和進(jìn)程調(diào)度。 當(dāng)用戶調(diào)用一個(gè)文件時(shí),他不需要因?yàn)槲募儆诓煌奈募到y(tǒng)而按照不同的 方式讀取。vfs 本身抽象了不同文件系統(tǒng)共同部分,對用戶屏蔽了具體的操作2, 使得用戶不用再去關(guān)心文件所屬的文件系統(tǒng)的問題,實(shí)現(xiàn)了各個(gè)文件系統(tǒng)的良好兼 容。當(dāng)一個(gè)最

9、新推出的文件系統(tǒng)普遍被采用時(shí),linux 借助 vfs 的強(qiáng)大功能,可以 毫不費(fèi)力的實(shí)現(xiàn)新文件系統(tǒng)在本地的組織運(yùn)行,同時(shí)能不干擾其他已經(jīng)裝配在本地 的其他文件系統(tǒng),可以說以 vfs 組織文件系統(tǒng)是非常具有可擴(kuò)展性,并具有優(yōu)良的 發(fā)展前景。 1.1.21.1.2 linuxlinux 研究現(xiàn)狀 linux 操作系統(tǒng)的全稱是 gnu/linux,它是由 gnu 工程和 linux 內(nèi)核兩個(gè)部 分共同組成的一個(gè)操作系統(tǒng),雖然這個(gè)系統(tǒng)誕生于 1992 年,比 windows 操作系統(tǒng) 要晚,但是與 windows 相比它有很多獨(dú)到的優(yōu)勢。首先,對于普通用戶而言它有以 下幾個(gè)優(yōu)點(diǎn):1.極高的穩(wěn)定性:回顧

10、 linux 的歷史我們會發(fā)現(xiàn),linux 操作系統(tǒng)的架 構(gòu)完全沿襲了 unix 的系統(tǒng)架構(gòu),所以先天就具有成熟穩(wěn)定的特點(diǎn),在這方面不是 另起爐灶的 windows 系列操作系統(tǒng)可以比擬的。2.先天的安全性:可以說一個(gè)操作 系統(tǒng)的架構(gòu)就已經(jīng)預(yù)先決定了它的安全性。linux 系統(tǒng)在設(shè)計(jì)的時(shí)候就是針對多用戶 環(huán)境的,所以對系統(tǒng)文件,用戶文件都做了明確的區(qū)分,每個(gè)文件都有不同的用戶 屬性。作為一個(gè)普通用戶通常只能讀寫自己的文件,而對一般的系統(tǒng)文件只能讀取 而不能改動(dòng),一些敏感的系統(tǒng)文件甚至連讀取都是被禁止的。這種設(shè)計(jì)在根本上保 證了系統(tǒng)的安全,即使一個(gè)用戶文件出現(xiàn)了問題,也不會泱及整個(gè)系統(tǒng)。linu

11、x 操 作系統(tǒng)從出現(xiàn)以后,由于其的開源性,使得 linux 操作系統(tǒng)功能越來越強(qiáng)大,性能 越來越穩(wěn)定,目前 linux 操作系統(tǒng)已經(jīng)能夠支持大多數(shù)的主流硬件平臺,這使得其 應(yīng)用范圍越來越廣泛,目前它已經(jīng)在中小型計(jì)算機(jī)上占據(jù)相當(dāng)大的市場份額;同時(shí), 在桌面操作系統(tǒng)上,它也打破了 windows 操作系統(tǒng)的壟斷。據(jù)統(tǒng)計(jì)到 2001 年,全 球 linux 的安裝數(shù)量已經(jīng)超過 2000 萬臺3??偟恼f來,linux 操作系統(tǒng)是一個(gè)迅速 發(fā)展,性能卓越,具有巨大發(fā)展?jié)摿Φ牟僮飨到y(tǒng)。 從 linux 內(nèi)核(kernel)0.13 版開始,就已經(jīng)實(shí)現(xiàn)了虛擬文件系統(tǒng),隨著 linux 內(nèi)核版本的不斷更新,虛

12、擬文件系統(tǒng)也不斷得到加強(qiáng)和完善。到目前(linux 2.6.16 版) ,其內(nèi)核中的虛擬文件系統(tǒng)已經(jīng)可以支持幾乎所有的常見文件系統(tǒng)4,例如: linux 中的 ext2,ext3;windows 中的 fat16,fat32,ntfs;光盤中的 iso9660;網(wǎng)絡(luò) 文件系統(tǒng)(nfs)等。雖然目前虛擬文件系統(tǒng)的功能已經(jīng)十分強(qiáng)大,但遠(yuǎn)沒有達(dá)到完 美的境界,還有大量可以改進(jìn)的地方。同時(shí),就目前全球 linux 分布的情況分析看, 歐洲最發(fā)達(dá),北美次之,而亞洲相對較少,而在亞洲分布的情況看,主要集中在中 國,日本,韓國。雖然 linux1992 年就出現(xiàn)了,但一直到 1998 年,其才真正進(jìn)入 中國

13、。在歐洲,已經(jīng)有許多專注于 linux 開發(fā)的公司和研究機(jī)構(gòu),例如:redhat, 美國的許多大型 it 巨頭也開始擁抱 linux,ibm 公司,sun 公司,motorola 公司,intel 公司,amd 公司,dell 公司,hp 公司等都推出了各自的 linux 計(jì)劃。 在國內(nèi),雖然也有一些專注于 linux 的公司,例如:紅旗 linux,但相對于世界先 進(jìn)水平還有很大的差距。 1.2 課題研究的目的和意義 目前,linux 操作系統(tǒng) 憑借其穩(wěn)定可靠的性能, linux 操作系統(tǒng)的應(yīng)用越 來越廣泛,特別是在網(wǎng)絡(luò)服務(wù)器領(lǐng)域。它的崛起,蠶食了許多原來是其他操作 系統(tǒng)占據(jù)的市場空間 5。

14、現(xiàn)在,其他類型的操作系統(tǒng)為了與 linux 競爭市場, 也在努力提高它們的文件系統(tǒng),而出色的文件系統(tǒng)管理功能正是linux 相對 于其他操作系統(tǒng)的優(yōu)勢所在。在這種背景下,我們非常有必要深入研究 linux 的虛擬文件系統(tǒng),努力去改進(jìn)提高它的性能。只有這樣,才能保持 linux 操作系統(tǒng)的優(yōu)勢。 一提到 linux 操作系統(tǒng),就不得不談它的文件系統(tǒng),因 為 linux 對文件的管理是最出色的,這也是 linux 的精華所在。linux 在管理文件 系統(tǒng)方面的最大特征就是實(shí)現(xiàn)了虛擬文件抽象機(jī)制,這種機(jī)制不僅使得 linux 可以 支持所有類型的文件系統(tǒng),更重要的一點(diǎn),通過動(dòng)態(tài)掛載和卸載文件系統(tǒng),可

15、以明 顯減少操作系統(tǒng)對資源的占有量,顯著提高操作系統(tǒng)運(yùn)行效率。由于 linux 操作系 統(tǒng)的完全開源性,這使得我們可以有機(jī)會對 linux 系統(tǒng)內(nèi)部的具體實(shí)現(xiàn)機(jī)制進(jìn)行研 究并加以修改,逐步完善并提升 linux 的功能。 總的說來,對 linux 操作系統(tǒng)進(jìn)行分析研究,是很有意義的,特別的是對 linux 操作系統(tǒng)的精華虛擬文件系統(tǒng)進(jìn)行分析研究,是很有必要的。通過分析 和研究,可以設(shè)計(jì)出更加優(yōu)秀的 linux 系統(tǒng)。也可以給我們在進(jìn)行其他系統(tǒng)軟件設(shè) 計(jì)過程中提供許多值得借鑒的和思考的東西。同時(shí),目前國內(nèi) linux 的普及度還不 高,人們對其了解也不深,研究 linux 有助于提高我國在這一領(lǐng)

16、域的技術(shù)水平,縮 短同世界先進(jìn)水平之間的差距。由于其開源性,對它進(jìn)行研究,困難程度不是很大, 但意義卻很大,因?yàn)?linux 作為操作系統(tǒng)家族中的一員,我們可以通過對 linux 的 研究加強(qiáng)自身在操作系統(tǒng)研發(fā)方面的能力,打破美國在這一核心領(lǐng)域的壟斷地位。 第二章 總體規(guī)劃 2.1 設(shè)計(jì)思路 由于 linux 操作系統(tǒng)的一個(gè)重要特點(diǎn)就是模塊化,這些模塊可以編譯時(shí)靜態(tài) 地鏈接,也可以在運(yùn)行時(shí)動(dòng)態(tài)鏈接,當(dāng)系統(tǒng)運(yùn)行需要用到某個(gè)模塊所提供的功能 時(shí),內(nèi)核就臨時(shí)把該模塊從外存中加載到內(nèi)存中,當(dāng)不再需要這個(gè)模塊時(shí), linux 內(nèi)核又會將它卸載6。例如,通常情況下,桌面 linux 對 ntfs 文件系統(tǒng)

17、的 支持就是模塊化的,當(dāng)我們沒有去訪問 ntfs 文件系統(tǒng)中的內(nèi)容時(shí),內(nèi)存中就沒 有加載該模塊,但是,一旦掛載了 ntfs 文件系統(tǒng),其相應(yīng)模塊就會被加載入內(nèi) 存,以支持對 ntfs 文件系統(tǒng)的操作;一旦斜載 ntfs 文件系統(tǒng)后,如果 linux 系統(tǒng)中也沒有別的地方需要用到 ntfs 文件系統(tǒng),內(nèi)核中的 模塊管理程序就會 把該模塊從內(nèi)存中清除。linux 內(nèi)核對動(dòng)態(tài)加載模塊的支持使得 linux 的內(nèi)核可 以變得很小,運(yùn)行起來更加高效。而且 linux 內(nèi)核具有其他很多操作系統(tǒng)不具備 的功能,它可以進(jìn)行重新編譯,可以進(jìn)行剪裁,可以根據(jù)自己的需要進(jìn)行裁減, 增加自己需要的功能,刪除不需要的功

18、能,例如在這里,我需要做一個(gè)用于管理 文件系統(tǒng)的小型系統(tǒng),那么我就可以通過重新編譯 linux 內(nèi)核,去掉網(wǎng)絡(luò),聲音, 游戲,usb 設(shè)備等很多不需要的內(nèi)容,而增加那些在默認(rèn)情況下沒有進(jìn)行支持的 文件系統(tǒng)的支持。 linux 內(nèi)核對模塊的加載是具有“堆砌”性的7。 (其含義可以用圖 3 來說明: )比如,系統(tǒng)在運(yùn)行時(shí)發(fā)現(xiàn)需要用到模塊 a,但是模塊 a 又不在內(nèi)存中,那么系 統(tǒng)就需要加載模塊 a,加載進(jìn)來后,系統(tǒng)又發(fā)現(xiàn),模塊 a 在其實(shí)現(xiàn)過程中又用到 了模塊 b 和模塊 c,那么系統(tǒng)又會自動(dòng)地把模塊 b 和模塊 c 加載進(jìn)來。模塊 a 和模塊 b , c 的關(guān)系稱為模塊 a 位于模塊 b,c 之

19、上(be on the top of),也稱為模 塊 b,c 為模塊 a 所用(be used by)。為了實(shí)現(xiàn)自動(dòng)動(dòng)態(tài)加載模塊,linux 為每個(gè)模 塊建立了一些數(shù)據(jù)結(jié)構(gòu),這個(gè)結(jié)構(gòu)體中有一個(gè) count 成員,但 count 為 0 的時(shí)候, 證明此時(shí)已經(jīng)沒有進(jìn)程或者別的模塊使用該模塊,系統(tǒng)將把這個(gè)模塊卸載;否則, 表示該模塊正被使用,系統(tǒng)不能將它卸載。系統(tǒng)只有在 count 成員為 0 后才會把 該模塊從內(nèi)存中刪除。 module a module bmodule c 系統(tǒng)加載模塊系統(tǒng)加載模塊 a 后,發(fā)現(xiàn)后,發(fā)現(xiàn) a 用到了用到了 b,c;而;而 b,c 都不在內(nèi)存中,于都不在內(nèi)存中,于

20、 是接著加載是接著加載 b,c 圖 2.1 linux 內(nèi)核模塊的“堆砌”性 一個(gè)典型的桌面 linux 系統(tǒng)包括 3 個(gè)主要的軟件層-linux 內(nèi)核、c 庫 和應(yīng)用程序代碼8。內(nèi)核是唯一可以完全控制硬件的層,內(nèi)核驅(qū)動(dòng)程序代表 應(yīng)用程序與硬件之間進(jìn)行會話。內(nèi)核之上是 c 庫,負(fù)責(zé)把 posix api 轉(zhuǎn)換為 內(nèi)核可以識別的形式,然后調(diào)用內(nèi)核,從應(yīng)用程序向內(nèi)核傳遞參數(shù)。應(yīng)用程 序依靠驅(qū)動(dòng)內(nèi)核來完成特定的任務(wù),但是根據(jù)實(shí)際情況,這樣做需要較大的 內(nèi)核,所以這里采用應(yīng)用程序直接跟內(nèi)核會話,這樣既可以減少內(nèi)核大小, 還可以提高運(yùn)行速度。 所以我把畢業(yè)設(shè)計(jì)的目標(biāo)定在盡量對 linux 內(nèi)核進(jìn)行裁減,

21、去除進(jìn)程調(diào) 度,內(nèi)存分配等許多內(nèi)容和模塊,使其只剩下文件管理功能,但它應(yīng)該保留 虛擬文件系統(tǒng)的特征,能夠訪問多種不同格式的實(shí)際文件系統(tǒng)。而且它不需 要其他操作系統(tǒng)平臺支持就可以單獨(dú)運(yùn)行。此時(shí)的這個(gè)文件系統(tǒng)管理程序應(yīng) 該至少具有以下幾大功能: 以 linux 方式組織文件。 復(fù)制文件。 刪除文件。 編輯文件。 重命名文件。 創(chuàng)建和刪除文件夾。 掛載和卸載其他種類的文件系統(tǒng)。 在具體實(shí)現(xiàn)上,我選用的 linux 內(nèi)核版本為 2.4.20,這個(gè)版本發(fā)布與 2002 年 11 月 28 號,之所以選擇它,因?yàn)樗枪J(rèn)的目前 linux 內(nèi)核中最穩(wěn) 定的一個(gè)高端版本,并且它的功能十分強(qiáng)大,這個(gè)內(nèi)核版本支

22、持幾乎所有在 市場上可以買到的處理器芯片;支持模塊化調(diào)用;支持各種類型的網(wǎng)絡(luò);支 持許多種的文件系統(tǒng);支持多種外部設(shè)備;支持即插即用設(shè)備;支持圖形用 戶界面,還支持很多種新型技術(shù):例如藍(lán)牙技術(shù)、紅外線技術(shù)、ipv6 等。 2.2 實(shí)施方案 我的方案就是:先利用 linux 內(nèi)核重編譯技術(shù),裁減 linux 內(nèi)核,去掉 linux 內(nèi)核對網(wǎng)絡(luò)的支持,對 usb 接口的支持,對聲音的支持,對 scsi 設(shè) 備的支持,對熱插拔技術(shù)的支持,對新型技術(shù)的支持等;總之:裁減之后的 內(nèi)核應(yīng)該盡量只支持對文件的管理功能,當(dāng)然,為了能正常運(yùn)行,這個(gè)內(nèi)核 還應(yīng)該支持主流的 cpu 例如 x86 系列,為了實(shí)現(xiàn)虛擬

23、文件系統(tǒng),它還應(yīng)該 支持 ide 接口的硬盤,支持內(nèi)存管理。第二步:通過分析內(nèi)核相關(guān)部分的源 代碼,修改其中一些部分,這樣可以進(jìn)一步縮減內(nèi)核大小。這次裁減之后的 新內(nèi)核應(yīng)該具有如下的特征:除了管理文件系統(tǒng)所需要的底層支撐功能外, 其他與文件系統(tǒng)并列的其他功能都盡量去除了,它的功能就是對多種實(shí)際文 件系統(tǒng)進(jìn)行管理,協(xié)調(diào)它們在計(jì)算機(jī)系統(tǒng)中共存。最后一步:將這個(gè)裁減后 的內(nèi)核移植到一張軟盤上面,使其可以單獨(dú)運(yùn)行,為了達(dá)到這個(gè)目的,我必 須先為這個(gè)系統(tǒng)制作一個(gè)引導(dǎo)程序,然后加上一個(gè)根文件系統(tǒng)和一些用于文 件系統(tǒng)的常用命令。因?yàn)槲易鲞@個(gè)系統(tǒng)的主要目的是研究 linux 中的虛擬文 件系統(tǒng),所以對這個(gè)功能

24、的支持的必須的。在虛擬文件系統(tǒng)下面應(yīng)該盡可能 地多支持實(shí)際文件系統(tǒng),我的初步設(shè)想是至少應(yīng)該包含多以下幾種文件系統(tǒng) 的支持:windows 中的 fat16/32 文件系統(tǒng),windows 中使用的 ntfs 文件 系統(tǒng),linux 中用的 ext2/3 文件系統(tǒng),linux 中使用的 minix 文件系統(tǒng),光 盤上使用 iso9660 文件系統(tǒng),管理設(shè)備時(shí)用到的設(shè)備文件系統(tǒng)。對于其他種 類的文件系統(tǒng),視軟盤的空間組織情況來決定是否提供支持。 概括起來說,這個(gè)小型系統(tǒng)分為四個(gè)部分:系統(tǒng)啟動(dòng)部分、系統(tǒng)內(nèi)核部 分、外圍程序部分、根文件系統(tǒng)。 對于系統(tǒng)啟動(dòng)部分:完成起來比較簡單,可以選擇使用 grub

25、,lilo,syslinux 等,也可以自己編寫,鑒于時(shí)間上的關(guān)系,我決定使 用 grub 進(jìn)行系統(tǒng)引導(dǎo),利用 grub 程序?qū)⒁龑?dǎo)程序?qū)懭胲洷P的主引導(dǎo)扇 區(qū)(mbr)中去。 對于系統(tǒng)內(nèi)核部分:需要先對內(nèi)核進(jìn)行重新編譯,去除那些不必要的功 能,增加那些對文件系統(tǒng)的支持。 對于外圍程序部分:使用一個(gè)在嵌入式 linux 領(lǐng)域使用很廣泛的軟件 busybox,它包含了一個(gè) shell 程序和一些 linux 中常用的命令,但是它的 總大小卻只有幾百 kb,而且 busybox 也同時(shí)支持動(dòng)態(tài)編譯和靜態(tài)編譯,由 于 busybox 并沒有包含所有的 linux 中的命令,在這里,還需要為管理文件 系

26、統(tǒng)自己添加幾個(gè)命令,如 mount,umount 命令。 根文件系統(tǒng)采用 ext2 文件系統(tǒng),創(chuàng)建必要的目錄和文件,然后增加一些 用與系統(tǒng)初始化的腳本程序,如 inittab,fstab 文件。 當(dāng)把上面四個(gè)部分都準(zhǔn)備好以后,還需要將四者組裝到一起,考慮到節(jié) 省空間的問題,這里準(zhǔn)備使用 linux 內(nèi)核所支持的虛擬磁盤技術(shù)(ram disk), 將外圍程序部分先進(jìn)行高度壓縮,在系統(tǒng)啟動(dòng)后,把內(nèi)核和壓縮后的外圍程 序部分都裝入內(nèi)存,然后解壓外圍程序部分,然后運(yùn)行。 概括起來說,要做好這個(gè)小型系統(tǒng),首先要編譯出一個(gè)合適的內(nèi)核,在 這里,為了空間大小的關(guān)系,最好是采用靜態(tài)編譯,制作好引導(dǎo)程序,有了

27、這兩步,系統(tǒng)就基本可以運(yùn)行了,但這時(shí)無法與用戶交互,為此,還必須有 一個(gè)根文件系統(tǒng)和一個(gè) shell,以上幾個(gè)部件都準(zhǔn)備好以后,系統(tǒng)也就基 本完成了。 第三章 對虛擬文件系統(tǒng) 的分析 3.1 虛擬文件系統(tǒng) 數(shù)據(jù)結(jié)構(gòu) linux vfs 提供了一種接口面向所有 linux 內(nèi)核所能支持的文件系統(tǒng)。 竟管各種不同操作系統(tǒng)有著不同的格式與具體實(shí)現(xiàn),但面向她們的接口保持 一致。 vfs 提供了一系列的數(shù)據(jù)結(jié)構(gòu)和虛擬方法來訪問文件系統(tǒng)。在 vfs 層提 供了一些默認(rèn)的文件系統(tǒng)操作的實(shí)現(xiàn),某個(gè)具體文件系統(tǒng)覆蓋這些默認(rèn)的實(shí) 現(xiàn)僅僅當(dāng)它需要定制自己的實(shí)現(xiàn)過程時(shí)9。因?yàn)?linux 內(nèi)核是用 c 寫的, lin

28、ux 中虛擬方法的實(shí)現(xiàn)機(jī)制與那些用面向?qū)ο笳Z言實(shí)現(xiàn)的虛擬方法有所不 同。在這里是用函數(shù)指針來實(shí)現(xiàn)虛擬函數(shù)的。 3.1.1 超級塊 linux vfs 中一個(gè)最重要的概念就是超級塊??偟膩砜矗墘K包含所 有關(guān)于一個(gè)文件系統(tǒng)的關(guān)鍵信息。當(dāng)某個(gè)文件系統(tǒng)被掛載時(shí),超級塊將被讀 (通過一個(gè)系統(tǒng)調(diào)用 filesystem_read_super)并且,超級塊包含訪問文件系統(tǒng)其 他部分的必要的信息10。有些文件系統(tǒng)(例如 ms-dos fat)沒有超級塊,這 時(shí),vfs 將為他們創(chuàng)建一個(gè)“虛擬”超級塊。同時(shí),由于在一個(gè)計(jì)算機(jī)系統(tǒng) 中可能存在多個(gè)文件系統(tǒng),在虛擬文件系統(tǒng)中也就對應(yīng)有多個(gè)超級塊,為了 便于管理,

29、系統(tǒng)用一個(gè)雙向鏈表存儲它們。 super_block 結(jié)構(gòu)體定義在。出來包含關(guān)于所有文件系統(tǒng)的 通用信息外,它還包含一個(gè)聯(lián)合體,這個(gè)聯(lián)合體中存放一些與某特定文件系 統(tǒng)具體相關(guān)信息的結(jié)構(gòu)體。 struct super_block struct list_heads_list; kdev_ts_dev; unsigned longs_blocksize; unsigned chars_blocksize_bits; unsigned char s_lock; unsigned chars_rd_only; unsigned char s_dirty; struct file_system_type

30、 * s_type; struct super_operations * s_op; struct dquot_operations * dq_op; unsigned longs_flags; unsigned long s_magic; unsigned long s_time; struct dentry *s_root; struct wait_queue *s_wait; struct inode *s_ibasket; short ints_ibasket_count; short ints_ibasket_max; struct list_heads_dirty; union s

31、truct minix_sb_info minix_sb; struct ext2_sb_info ext2_sb; void *generic_sbp; u; ; s_list:這個(gè)成員被用來維持一個(gè)超級塊雙向鏈表,它包含 next,previous 指針。 s_dev:這是該文件系統(tǒng)的實(shí)際物理設(shè)備,有些文件系統(tǒng)(最著名的就是 pro 文件系統(tǒng))不需要物理設(shè)備。對于那樣的文件系統(tǒng),這個(gè)成員將被忽略。 s_blocksize:這個(gè)成員包含該文件系統(tǒng)的塊大小(以 byte 為單位)。 s_blocksize_bits:與前一成員具有相同的值,只是它是一 bit 為單位。 s_lock:這個(gè)成員被

32、用來給超級塊加鎖,從而保證對超級塊的順序訪問。 s_rd_only:這個(gè)成員目前沒有用。 s_dirty:這是一個(gè)標(biāo)志,用來指示該超級塊是否變臟,超級塊是臟的如果 從它最后一次寫入磁盤后已經(jīng)發(fā)生了內(nèi)容改變。 s_type:這是一個(gè)指針指向這個(gè)文件系統(tǒng)的 file_system_type 目錄項(xiàng)。 s_op:這是一個(gè)指向該文件系統(tǒng)超級塊操作集結(jié)構(gòu)體的指針。 dq_op:這是一個(gè)指向磁盤配額結(jié)構(gòu)體的指針。 s_flags:這個(gè)成員包含該文件系統(tǒng)的掛載標(biāo)志,這些信息包含一些信息, 比如:這個(gè)文件系統(tǒng)是否需要一個(gè)設(shè)備,或者這個(gè)文件系統(tǒng)是否以只讀方式 掛載。 s_magic:這是一個(gè)魔數(shù)用來標(biāo)識呈現(xiàn)在設(shè)

33、備上的文件系統(tǒng)的類型。 s_time:標(biāo)示超級塊最后一個(gè)被修改的時(shí)間。 s_root:這是一個(gè)指向該文件系統(tǒng)跟目錄的指針。 s_wait:這是一個(gè)包含當(dāng)前正在等待訪問超級塊的任務(wù)的等待隊(duì)列。 s_ibasket:這個(gè)成員暫時(shí)沒有用到。 s_ibasket_count: 這個(gè)成員暫時(shí)沒有用到。 s_ibaskte_max: 這個(gè)成員暫時(shí)沒有用到。 s_dirty:這是該文件系統(tǒng)當(dāng)前所有臟 i 節(jié)點(diǎn)所組成的鏈表。 super_operartions 結(jié)構(gòu)體是放在中,它實(shí)際上是一個(gè)虛擬 函數(shù)表,該表包含所有用來操作超級塊的函數(shù)。每個(gè)特定的文件系統(tǒng)都希望 覆蓋這些函數(shù)并提供它們自己的函數(shù)指針集。 st

34、ruct super_operations void (* read_inode) struct inode *; void (* write_inode) struct inode *; void (* put_inode) struct inode *; void (* delete_inode) struct inode *; int (*notify_change) struct dentry*,struct iaddr *; void (*put_super) struct super_block *; void (*write_super) struct super_block *

35、; int (*statfs) struct super_block *,struct statfs *,int; int (*remount_fs) struct super_block *,int,char *; void (*clear_inode) struct inode *; void (*umout_begin) struct super_block *; ; read_inode:當(dāng)一個(gè)索引節(jié)點(diǎn)從文件系統(tǒng)被讀入時(shí)這個(gè)函數(shù)被調(diào)用。這個(gè) 函數(shù)負(fù)責(zé)填充索引節(jié)點(diǎn)結(jié)構(gòu)體大多數(shù)成員(包括 inode_operation 指針)。 write_inode:這個(gè)函數(shù)用來將一個(gè)索引節(jié)點(diǎn)寫出到磁盤

36、中。 put_inode:將索引節(jié)點(diǎn)從索引節(jié)點(diǎn)高速緩存中移出。 delete_inode:當(dāng)某個(gè)文件被刪除時(shí),這個(gè)函數(shù)將被調(diào)用。它將釋放文件 的索引節(jié)點(diǎn)和數(shù)據(jù)塊并將空間歸還給內(nèi)存。 notify_change:當(dāng)一個(gè)索引節(jié)點(diǎn)的屬性改變時(shí),這個(gè)函數(shù)將被調(diào)用。 put_super:當(dāng)卸載一個(gè)文件系統(tǒng)釋放超級塊給內(nèi)存時(shí),這個(gè)函數(shù)將被調(diào)用。 write_super:這個(gè)函數(shù)將超級快寫出到磁盤中。 statfs:這個(gè)函數(shù)用來統(tǒng)計(jì)該文件系統(tǒng)的有關(guān)信息。 remount_fs:當(dāng)一個(gè)文件系統(tǒng)被重新掛載時(shí)(為了改變掛載標(biāo)志)將被調(diào)用。 clear_inode:這個(gè)函數(shù)與 delete_inode 類似,但是它

37、是在索引節(jié)點(diǎn)被反散 列后并且所有對它的引用被清除了后調(diào)用的。 umount_begin:當(dāng) vfs 開始卸載一個(gè)文件系統(tǒng)時(shí),這個(gè)函數(shù)將被調(diào)用。 3.1.2 索引節(jié)點(diǎn) vfs 中另外一個(gè)重要概念就是索引節(jié)點(diǎn)。一個(gè)索引節(jié)點(diǎn)代表一個(gè)獨(dú)立的 文件系統(tǒng)實(shí)體11,例如一個(gè)文件,目錄,管道,套接字。文件系統(tǒng)中的每一 個(gè)實(shí)體有一個(gè)唯一的索引節(jié)點(diǎn),但是通過使用硬鏈接和符號鏈接,使得通過 多個(gè)名字訪問同一個(gè)實(shí)體成為現(xiàn)實(shí)。 索引節(jié)點(diǎn)結(jié)構(gòu)體也存放在中。它包含很多信息,這些信息被 多種類型的文件系統(tǒng)的不同 i 節(jié)點(diǎn)使用。與 super_block 結(jié)構(gòu)體一樣,它也包 含一個(gè)聯(lián)合體(成員由與特定文件系統(tǒng)相關(guān),類型相關(guān)的結(jié)

38、構(gòu)體)。 struct inode struct list_headi_hash; struct list_headi_list; struct list_headi_dentry; unsigned long i_ino; unsigned int i_count; kedv_ti_dev; umode_ti_mode; nlink_ti_nlink; uid_ti_uid; gid_ti_gid; kdev_ti_rdev; off_ti_size; time_ti_atime; time_ti_mtime; time_ti_ctime; unsigned longi_blksize; u

39、nsigned longi_blocks; unsigned longi_version; unsigned longi_nrpages; struct semaphorei_sem; struct semaphorei_atomic_write; struct inode_operation *i_op; struct super_block *i_sb; struct wait_queue *i_wait; struct file_lock *i_flock; struct vm_area_struct *i_mmap; struct page *i_pages; struct dquot

40、 *i_dquotmaxquotas; unsigned longi_state; unsigned inti_flags; unsigned chari_pipe; unsigned chari_sock; inti_writecount; unsigned inti_attr_flags; _u32i_generation; union struct pipe_inode_infopipe_i; struct minix_inode_infominix_i; void*generic_ip; u; ; i_hash:這個(gè)成員用來維持一個(gè)雙向隊(duì)列以解決因?yàn)樯⒘袥_突。 i_list:這個(gè)用來將

41、索引節(jié)點(diǎn)放到三個(gè)雙向隊(duì)列中。 i_dentry:這是一個(gè)與該索引節(jié)點(diǎn)對應(yīng)的目錄項(xiàng)鏈表。 i_no:這是一個(gè)用來標(biāo)示該索引節(jié)點(diǎn)的數(shù)字,它在同一個(gè)文件系統(tǒng)中保持 唯一。 i_count: 該索引節(jié)點(diǎn)的引用數(shù),當(dāng)它變成 0 時(shí),我們可以將它從內(nèi)存中 移出。 i_dev:這是該索引節(jié)點(diǎn)所屬文件系統(tǒng)的物理設(shè)備標(biāo)示。 i_mode:這個(gè)成員包含文件類型和訪問權(quán)限。 i_nlink:這是該索引節(jié)點(diǎn)的硬鏈接數(shù),如果它為 0,該索引節(jié)點(diǎn)可以刪除 了。 i_uid:該索引節(jié)點(diǎn)的主人的 user id。 i_gid: 該索引節(jié)點(diǎn)的主人的 group id。 i_rdev:如果該索引節(jié)點(diǎn)是一個(gè)設(shè)備文件對應(yīng)的 i 節(jié)點(diǎn)

42、,它就是該設(shè)備標(biāo) 示。 i_size:該索引節(jié)點(diǎn)對應(yīng)的文件的字節(jié)數(shù)。 i_atime:上次訪問的時(shí)間。 i_mtime:上次修改的時(shí)間。 i_ctime:文件創(chuàng)建的時(shí)間。 i_blksize:文件系統(tǒng)每個(gè)塊的字節(jié)數(shù)。 i_blocks:文件所含有塊數(shù)。 i_version:用來檢查失效信息,當(dāng)索引節(jié)點(diǎn)出現(xiàn)相關(guān)變化時(shí),它將被更新。 i_nrpages:當(dāng)前實(shí)際用來映射該文件的內(nèi)存頁數(shù)。 i_sem:這是一個(gè)信號量,它用來控制對索引節(jié)點(diǎn)的訪問,阻止在讀的時(shí) 候?qū)?i 節(jié)點(diǎn)進(jìn)行修改。 i_atomic_write:它用來標(biāo)記一個(gè)對管道的原子性寫操作正在被請求。它 必須在獲得其他通用索引節(jié)點(diǎn)信號量前完

43、成。 i_op:這是一個(gè)指向該索引節(jié)點(diǎn)操作集的指針。 i_sb:指向該索引節(jié)點(diǎn)所屬文件系統(tǒng)的超級塊的指針。 i_wait:這是一個(gè)等待隊(duì)列,該隊(duì)列包含所有因訪問該索引節(jié)點(diǎn)而等待的 任務(wù),當(dāng)該 i 節(jié)點(diǎn)變的可用時(shí),這些任務(wù)將會被通知。 i_flock:這是一個(gè)文件鎖鏈表,文件鎖被同時(shí)保存在每個(gè)索引節(jié)點(diǎn)的單向 鏈表和系統(tǒng)為所有文件鎖所設(shè)立的雙向鏈表中。 i_mmap:指向用來映射該文件的內(nèi)存區(qū)域。 i_pages:該文件所對應(yīng)內(nèi)存頁鏈表。 i_dquot:磁盤配額信息。 i_state:用來標(biāo)示該索引節(jié)點(diǎn)的當(dāng)前狀態(tài),有關(guān)于該索引節(jié)點(diǎn)是否變臟, 是否被鎖,是否存在與一個(gè)已經(jīng)被釋放的進(jìn)程中等標(biāo)志。 i

44、_flags:標(biāo)示索引節(jié)點(diǎn)的的屬性,當(dāng)前屬性包括:文件不變性,異步寫, 不更新文件訪問時(shí)間,文件是追加,該文件的配額被初始化。 i_pipe: 表示這個(gè)索引節(jié)點(diǎn)代表一個(gè)管道文件。 i_sock: 表示這個(gè)索引節(jié)點(diǎn)代表一個(gè)套接字文件。 i_writecount:為負(fù)表示寫不允許,為正表示當(dāng)前正在被寫,為 0 表示其 他情況。 i_attr_flags:文件的屬性信息,目前與 i_flags 相似。 inode_operations 結(jié)構(gòu)體同樣存在與中。它同樣是一個(gè)虛函 數(shù)表包含操作 i 節(jié)點(diǎn)的函數(shù)。每個(gè)具體的文件系統(tǒng)不是只提供一組 i 節(jié)點(diǎn)操 作,她們通常提供一些不同的操作針對與不同的 i 節(jié)點(diǎn)

45、類型(目錄,文件,管 道,套接字)。 struct inode_operations struct file_operations * default_file_ops; int (*create) struct inode *,struct dentry *,int; int (*lookup) struct inode *,struct dentry * ; int (*link) struct dentry *,struct inode *,struct dentry *; int (*unlink) struct inode *,struct dentry *; int (*symli

46、nk) struct inode *,struct dentry *,const char *; int (*mkdir) struct inode *,struct dentry *,int; int (*rmdir) struct inode *,struct dentry * ; int (*mknode) struct inode *,struct dentry *,int ,int; int (*rename) struct inode *,struct dentry *, struct inode *,struct dentry *; int (*readlink) struct

47、dentry *,char *,int; struct dentry *(*follow_link) struct dentry *, struct dentry *,unsigned int; int (*readpage) struct file *,struct page *; int (*writepage) struct file *,struct page *; int (*bmp) struct inode *,int; void (*truncate) struct inode *; int (*permission) struct inode *,int; int (*smp

48、) struct inode *,int ; int (*updatepage) struct file*,struct page *, unsigned long,unsigned int ,int; int (*revalidate) struct dentry *; ; default_file_ops:這是一些默認(rèn)的文件操作用來打開一個(gè)文件,打開操作 會根據(jù)文件類型提供恰當(dāng)?shù)牟僮鳌?create:用來創(chuàng)建一個(gè)新的索引節(jié)點(diǎn)。 lookup:該函數(shù)用來查找目錄項(xiàng)并返回對應(yīng)的索引節(jié)點(diǎn),此操作只提供給 目錄。 link:用來建立一個(gè)硬鏈接,從一個(gè)目錄項(xiàng)到一個(gè)特定索引節(jié)點(diǎn),在執(zhí)行 操作之前必須進(jìn)

49、行檢查以保證硬鏈接與原文件在同一個(gè)文件系統(tǒng)中。 unlink:從一個(gè)文件系統(tǒng)中刪除一個(gè)索引節(jié)點(diǎn)。 symlink:建立一個(gè)目錄項(xiàng)到某索引節(jié)點(diǎn)的符號鏈接。 mkdir:建立一個(gè)子目錄。 rmdir:刪除一個(gè)特定子目錄。 mknode:用來創(chuàng)建一個(gè)設(shè)備文件,命名管道,套接字。 rename:通過刪除原目錄項(xiàng),建立新目錄項(xiàng)來改變一個(gè)文件的名字。 readlink:用來出來一個(gè)有符號鏈接所指向的文件。 readpage:被內(nèi)存映象文件用來讀取一頁進(jìn)入內(nèi)存。 writepage: 被內(nèi)存映象文件用來寫一頁到磁盤中。 bmp:用來將文件中某塊映射到調(diào)用者的地址空間中。 truncate:用來調(diào)整文件的長度

50、,它可以縮短或者提升文件的長度。 permission:檢查某個(gè)特定 i 節(jié)點(diǎn)的的訪問權(quán)限。 smp:與 bmp 類似,只是它以扇區(qū)為單位。 updatepage:與 writepage 類似,但是它會做附加的檢查來看是否真需要 寫。 revalidate:用來保證某個(gè)文件的高速緩存是最新的。 3.1.3 文件 vfs 中第三個(gè)重要對象就是文件了。任何時(shí)候,當(dāng)一個(gè)進(jìn)程打開一個(gè)文 件,一個(gè)新的文件對象就創(chuàng)建了,這就意味著多個(gè)文件對象可以對應(yīng)與同一 個(gè)物理的文件。并且允許多個(gè)進(jìn)程(或者同一個(gè)進(jìn)程)去同時(shí)訪問一個(gè)文件的 不同部分12。文件結(jié)構(gòu)體,同樣也存在與比 super_block 結(jié)構(gòu)體 和 i

51、node 結(jié)構(gòu)體要簡單。 struct file struct file*f_next,*f_pprev; struct dentry *f_dentry; struct file_operations * f_op; mode_tf_mode; loff_tf_pos; unsigned intfcount,f_flags; unsigned longf_reada,f_ramax,f_raend,f_ralen,f_rawin; struct fown_structf_ower; unsigned longf_version; void*private_data; ; f_next,f_p

52、prev:用來實(shí)現(xiàn)一個(gè)雙向的文件結(jié)構(gòu)體鏈表。 f_dentry:目錄項(xiàng)(我們通過這個(gè)目錄項(xiàng)打開對應(yīng)的文件)。 f_op:指向文件操作表的指針。 f_mode:包括該文件的訪問權(quán)限。 f_pos:存放目前文件的偏移量的指針 fcount:該文件的引用次數(shù)。 f_flags:包含一些標(biāo)志:是否打開為讀,是否打開為寫,是否寫之前清空。 f_reada:一個(gè)標(biāo)志用來指示是否使用提前讀。 f_ramax:當(dāng)前的提前讀的最大頁面數(shù)。 f_raend:指向提前讀入的頁面之后的頁面中第一個(gè)字節(jié)。 f_ralen:提前讀入的最后一塊的大小。 f_rawin:目前的提前讀窗口大小。 f_ower:這個(gè)結(jié)構(gòu)體包括:

53、用戶 id,進(jìn)程 id,它還包括異步 i/o 中發(fā)送 給進(jìn)程的實(shí)時(shí)信號(該信號用來通知進(jìn)程,文件已經(jīng)準(zhǔn)備好 i/o)。 f_version:用來檢查失效信息,當(dāng)一個(gè)對文件的改變發(fā)生后,它被更新。 private_data:指向一些不透明數(shù)據(jù)的指針,vfs 將保留但不訪問這個(gè)指 針。 file_operations 結(jié)構(gòu)體定義在,同樣,它是一個(gè)虛函數(shù)表包含 用來操作文件的函數(shù)。 struct file_operations loff_t (*llseek) struct file *,loff_t,int; ssize_t (*read) struct file *,char *,size_t,

54、loff_t *; ssize_t (*write) struct file *,char *,size_t,loff_t *; int (*readdir) struct file *,void *,filldir_t; unsigned int (*poll) struct file *,struct poll_table_struct *; int (*ioctl) struct inode*,struct file*,unsigned int,unsigned long; int (*mmap) struct file *,struct vm_area_struct *; int (*

55、open) struct inode *,struct file*; int (*flush) struct file*; int (*release) struct inode *,struct file*; int (*fsync) struct file*,struct dentry*; int (*fasync) int,struct file*,int; int (*check_media_change) kdev_t dev; int (*revalidate) kdev_t dev ; int (*lock) struct file *,int,struct file_lock

56、*; ; llseek 負(fù)責(zé)設(shè)置文件的當(dāng)前偏移量指針。: read:將文件中的數(shù)據(jù)復(fù)制到特定緩沖區(qū)。 write:將緩沖區(qū)中的數(shù)據(jù)寫入文件指針?biāo)傅奈恢谩?readdir:從目錄中讀取下一個(gè)目錄項(xiàng)。 poll:檢查目前是否可以將數(shù)據(jù)讀入或者寫出。 ioctl:用來設(shè)置和讀取設(shè)備文件。 mmap:將文件中的一個(gè)扇區(qū)映射到當(dāng)前進(jìn)程的用戶地址空間。 open:當(dāng)一個(gè)文件被打開是這個(gè)函數(shù)被調(diào)用。 flush:當(dāng) vfs 關(guān)閉一個(gè)文件時(shí)將調(diào)用這個(gè)函數(shù)。 release:當(dāng)一個(gè)文件的引用計(jì)數(shù)器為 0 且即將從內(nèi)存中移出時(shí)此函數(shù)被調(diào) 用。 fsync:用來保證一個(gè)文件所有被修改的緩沖區(qū)都被寫回磁盤。 fas

57、ync:用來打開或者關(guān)閉異步文件更新機(jī)制。 check_media_change:這個(gè)函數(shù)只用在支持移動(dòng)介質(zhì)的塊設(shè)備,它檢查從 上次訪問后介質(zhì)是否有改變。 revalidate:這個(gè)函數(shù)只用在塊設(shè)備上,當(dāng)設(shè)備介質(zhì)改變后它將被調(diào)用來更 新必要的設(shè)備參數(shù)。 lock:用來在一個(gè)文件上獲取文件鎖。 3.2 文件系統(tǒng)高速緩存 為了提高文件系統(tǒng)的性能,linux 提供兩中文件系統(tǒng)高速緩存,緩沖區(qū) 高速緩存用來暫存那些正在讀取或者寫入到某文件的數(shù)據(jù),目錄高速緩存 (dcache)暫存目錄項(xiàng)信息,從而提高了文件查找的效率13。 3.2.1 緩沖區(qū)高速緩存 緩沖區(qū)高速緩作為一個(gè)接口存在與文件系統(tǒng)和實(shí)際物理設(shè)備

58、之間,當(dāng)一 個(gè)文件系統(tǒng)想從一個(gè)設(shè)備中讀取或者想向一個(gè)設(shè)備寫入數(shù)據(jù)時(shí),它將調(diào)用一 些為緩沖區(qū)高速緩設(shè)置的函數(shù),緩沖區(qū)高速緩存所隱含的主要思想是把進(jìn)程 從存取慢速磁盤數(shù)據(jù)的等待中解放出來。因此,如果同時(shí)寫入太多數(shù)據(jù),結(jié) 果反而是欲速則不達(dá)。反之,可以把數(shù)據(jù)劃分成小片并周期性地寫入磁盤, 以使 i/o 操作對用戶進(jìn)程速度的影響最小,用戶所感受的響應(yīng)時(shí)間最小。 內(nèi)核為每一個(gè)緩沖區(qū)維護(hù)很多信息,這些信息用來緩和寫操作,這些信 息包括一個(gè)“臟(dirty) ”位,表示內(nèi)存中的緩沖區(qū)已經(jīng)被修改,必須寫到 磁盤中去,還包括一個(gè)時(shí)間標(biāo)志,表示緩沖區(qū)被刷新到磁盤之前在內(nèi)存中停 留了多長的時(shí)間。緩沖區(qū)高速緩存的大小

59、可以變化。當(dāng)需要新緩沖區(qū)而現(xiàn)在 又沒有可用緩沖區(qū)時(shí),頁框按需要被分配。當(dāng)空閑內(nèi)存變得不足時(shí),就釋放 緩沖區(qū)并反復(fù)使用相應(yīng)的頁框。 緩沖區(qū)數(shù)據(jù)結(jié)構(gòu)中一個(gè)重要域就是 b_count,它是對應(yīng)緩沖區(qū)所使用的 一個(gè)引用計(jì)數(shù)器,在對緩沖區(qū)操作之前加 1,操作之后減 1。它主要起到安 全所的作用,因?yàn)橹灰糜?jì)數(shù)器不為 0,內(nèi)核就永遠(yuǎn)不會撤銷這個(gè)緩沖區(qū)。 相反,內(nèi)核會周期性或在空閑內(nèi)存不足的時(shí)候檢測已用緩沖區(qū),只有那些引 用計(jì)數(shù)器為 0 的緩沖區(qū)才能被撤銷,也就是說,雖然引用計(jì)數(shù)器為 0 是一個(gè) 緩沖區(qū)可以屬于緩沖區(qū)高速緩存,但是,不能確定這個(gè)緩沖區(qū)在高速緩存中 可以存在多長時(shí)間。 緩沖區(qū)高速緩存包括兩種

60、數(shù)據(jù)結(jié)構(gòu)14: 描述高速緩存中緩沖區(qū)的一組緩沖區(qū)首部。緩沖區(qū)首部 描述了與一對給定的設(shè)備號和塊號相關(guān)的緩沖區(qū)。 有助于內(nèi)核快速找到緩沖區(qū)首部的散列表。 通常情況下,緩沖區(qū)首部可能為以下狀態(tài)之一。 未用的緩沖區(qū)首部:該對象是可用的,但其域中的值沒 有什么意義。 空閑緩沖區(qū)的緩沖區(qū)首部:其 b_data 域指向一個(gè)空閑緩 沖區(qū),而 b_dev 域的值是 b_free,其實(shí)這個(gè)時(shí)候,這個(gè)緩沖區(qū) 是可用的,但其緩沖區(qū)首部本身是不可用的。 已用緩沖區(qū)的緩沖區(qū)首部:其 b_data 域指向一個(gè)存放緩 沖區(qū)高速緩沖中緩沖區(qū)。 異步緩沖區(qū)首部:其 b_data 域指向一個(gè)用來實(shí)現(xiàn)頁 i/o 操作的臨時(shí)緩沖區(qū)。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論