版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1 本科生畢業(yè)論文(設計)本科生畢業(yè)論文(設計)題 目linux 環(huán)境下虛擬文件系統(tǒng)分析研究學生姓名 指導教師 學 院 專業(yè)班級 完成時間2006 年 6 月i目錄摘要.iabstract.ii第一章 緒論.11.1 課題來源及研究背景 .11.1.1 虛擬文件系統(tǒng)概述.11.1.2 linux 研究現(xiàn)狀.11.2 課題研究的目的和意義 .2第二章 總體規(guī)劃.42.1 設計思路 .42.2 實施方案 .6第三章 對虛擬文件系統(tǒng)的分析 .83.1 虛擬文件系統(tǒng)數(shù)據(jù)結構 .83.1.1 超級塊.83.1.2 索引節(jié)點.113.1.3 文件.153.2 文件系統(tǒng)高速緩存 .173.2.1 緩沖區(qū)高速
2、緩存.173.2.2 目錄項高速緩存.183.2.3 索引節(jié)點高速緩存.193.3 掛載文件系統(tǒng) .203.3.1 注冊文件系統(tǒng).203.3.2 裝配文件系統(tǒng).203.4 卸載文件系統(tǒng) .21第四章 系統(tǒng)詳細設計.234.1 配置和編譯 linux 內核.234.2 制作根文件系統(tǒng) .264.3 制作 grub 引導 .284.4 配置并安裝 busybox .304.5 向 busybox 中添加自己書寫的命令 .324.6 制作內存磁盤映象文件 (ramdisk).344.7 運行與調試 .36ii第五章 總結與展望.405.1 總結 .405.2 設計收獲 .40致謝.41參考文獻.42
3、i摘要本文在對linux內核源代碼進行深入分析的基礎上,對linux的虛擬文件系統(tǒng)的內部實現(xiàn)機制進行研究,著重闡述linux虛擬文件系統(tǒng)是如何支持各種實際的物理文件系統(tǒng),最后從實踐的角度說明,如何將虛擬文件系統(tǒng)模塊從linux內核中剝離出來,并對剝離出來的部分進行適當修改,編寫一些為之服務的實用程序,使之成為一個可以脫離其他操作系統(tǒng)而獨立運行的小型系統(tǒng)。該系統(tǒng)的作用是管理文件系統(tǒng)和協(xié)調多種文件系統(tǒng)之間的共存。在具體實施過程中,采用過程分析的方法,通過對虛擬文件系統(tǒng)中文件操作過程和文件訪問過程的深入研究,抽象出linux的虛擬文件系統(tǒng)的工作方式和主要數(shù)據(jù)結構,總結出linux虛擬文件系統(tǒng)相對于其
4、他操作系統(tǒng)中文件系統(tǒng)的優(yōu)點,以此達到更好地認識虛擬文件系統(tǒng)。通過研究虛擬文件系統(tǒng),可以達到掌握其設計思想,進而改進的目的。關關鍵鍵詞詞 虛擬文件系統(tǒng),目錄項,索引節(jié)點iiabstractbased 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) of linux and especially explaines how the vfs sup
5、ports 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 system. this systems purpose is to manage file sy
6、stem 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 course analysis.through the research, we can know t
7、he characteristics of designing vfs,and improve it.key words virtual file system switch(vfs),dentry,inodlinux 環(huán)境下虛擬文件系統(tǒng)分析研究 第一章 緒論1第一章 緒論1.1 課題來源及研究背景1.1.1 虛擬文件系統(tǒng)概述linux 虛擬文件系統(tǒng):虛擬的概念是指它的所有數(shù)據(jù)結構都是在運行以后在內存中間建立的,并在卸載時刪除,在磁盤上并沒有存儲相應的數(shù)據(jù)結構。以之相對應的是具體的文件系統(tǒng),ext2 ,minix ,msdos,vfat 等文件系統(tǒng)。虛擬文件系統(tǒng)是操作系統(tǒng)與實際文件系統(tǒng)的一個接
8、口層1。它在操作系統(tǒng)中起到了很重要的作用,概括起來有以下幾點: 對具體文件系統(tǒng)的數(shù)據(jù)結構進行抽象,以一種統(tǒng)一的數(shù)據(jù)結構進行管理。 接受用戶層的系統(tǒng)調用,例如:write open stat link 等。 支持多種具體文件系統(tǒng)之間的相互訪問。 接受內核其他子系統(tǒng)的操作請求,例如內存管理,和進程調度。 當用戶調用一個文件時,他不需要因為文件屬于不同的文件系統(tǒng)而按照不同的方式讀取。vfs 本身抽象了不同文件系統(tǒng)共同部分,對用戶屏蔽了具體的操作2,使得用戶不用再去關心文件所屬的文件系統(tǒng)的問題,實現(xiàn)了各個文件系統(tǒng)的良好兼容。當一個最新推出的文件系統(tǒng)普遍被采用時,linux 借助 vfs 的強大功能,可
9、以毫不費力的實現(xiàn)新文件系統(tǒng)在本地的組織運行,同時能不干擾其他已經裝配在本地的其他文件系統(tǒng),可以說以 vfs 組織文件系統(tǒng)是非常具有可擴展性,并具有優(yōu)良的發(fā)展前景。1.1.21.1.2 linuxlinux 研究現(xiàn)狀linux 操作系統(tǒng)的全稱是 gnu/linux,它是由 gnu 工程和 linux 內核兩個部分共同組成的一個操作系統(tǒng),雖然這個系統(tǒng)誕生于 1992 年,比 windows 操作系統(tǒng)要晚,但是與 windows 相比它有很多獨到的優(yōu)勢。首先,對于普通用戶而言它有以下幾個優(yōu)點:1.極高的穩(wěn)定性:回顧 linux 的歷史我們會發(fā)現(xiàn),linux 操作系統(tǒng)的架構完全沿襲了 unix 的系統(tǒng)
10、架構,所以先天就具有成熟穩(wěn)定的特點,在這方面不是另起爐灶的 windows 系列操作系統(tǒng)可以比擬的。2.先天的安全性:可以說一個操作系統(tǒng)的架構就已經預先決定了它的安全性。linux 系統(tǒng)在設計的時候就是針對多用戶環(huán)境的,所以對系統(tǒng)文件,用戶文件都做了明確的區(qū)分,每個文件都有不同的用戶屬性。作為一個普通用戶通常只能讀寫自己的文件,而對一般的系統(tǒng)文件只能讀取而不能改動,一些敏感的系統(tǒng)文件甚至連讀取都是被禁止的。這種設計在根本上保linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第一章 緒論2證了系統(tǒng)的安全,即使一個用戶文件出現(xiàn)了問題,也不會泱及整個系統(tǒng)。linux 操作系統(tǒng)從出現(xiàn)以后,由于其的開源性,使得
11、linux 操作系統(tǒng)功能越來越強大,性能越來越穩(wěn)定,目前 linux 操作系統(tǒng)已經能夠支持大多數(shù)的主流硬件平臺,這使得其應用范圍越來越廣泛,目前它已經在中小型計算機上占據(jù)相當大的市場份額;同時,在桌面操作系統(tǒng)上,它也打破了 windows 操作系統(tǒng)的壟斷。據(jù)統(tǒng)計到 2001 年,全球 linux 的安裝數(shù)量已經超過 2000 萬臺3。總的說來,linux 操作系統(tǒng)是一個迅速發(fā)展,性能卓越,具有巨大發(fā)展?jié)摿Φ牟僮飨到y(tǒng)。從 linux 內核(kernel)0.13 版開始,就已經實現(xiàn)了虛擬文件系統(tǒng),隨著 linux 內核版本的不斷更新,虛擬文件系統(tǒng)也不斷得到加強和完善。到目前(linux 2.6.
12、16版) ,其內核中的虛擬文件系統(tǒng)已經可以支持幾乎所有的常見文件系統(tǒng)4,例如:linux 中的 ext2,ext3;windows 中的 fat16,fat32,ntfs;光盤中的 iso9660;網絡文件系統(tǒng)(nfs)等。雖然目前虛擬文件系統(tǒng)的功能已經十分強大,但遠沒有達到完美的境界,還有大量可以改進的地方。同時,就目前全球 linux 分布的情況分析看,歐洲最發(fā)達,北美次之,而亞洲相對較少,而在亞洲分布的情況看,主要集中在中國,日本,韓國。雖然 linux1992 年就出現(xiàn)了,但一直到 1998 年,其才真正進入中國。在歐洲,已經有許多專注于 linux 開發(fā)的公司和研究機構,例如:red
13、hat,美國的許多大型 it 巨頭也開始擁抱 linux,ibm 公司,sun 公司,motorola公司,intel 公司,amd 公司,dell 公司,hp 公司等都推出了各自的 linux 計劃。在國內,雖然也有一些專注于 linux 的公司,例如:紅旗 linux,但相對于世界先進水平還有很大的差距。1.2 課題研究的目的和意義目前,linux 操作系統(tǒng) 憑借其穩(wěn)定可靠的性能, linux 操作系統(tǒng)的應用越來越廣泛,特別是在網絡服務器領域。它的崛起,蠶食了許多原來是其他操作系統(tǒng)占據(jù)的市場空間5?,F(xiàn)在,其他類型的操作系統(tǒng)為了與linux 競爭市場,也在努力提高它們的文件系統(tǒng),而出色的文件
14、系統(tǒng)管理功能正是linux 相對于其他操作系統(tǒng)的優(yōu)勢所在。在這種背景下,我們非常有必要深入研究linux 的虛擬文件系統(tǒng),努力去改進提高它的性能。只有這樣,才能保持linux 操作系統(tǒng)的優(yōu)勢。 一提到 linux 操作系統(tǒng),就不得不談它的文件系統(tǒng),因為 linux 對文件的管理是最出色的,這也是 linux 的精華所在。linux 在管理文件系統(tǒng)方面的最大特征就是實現(xiàn)了虛擬文件抽象機制,這種機制不僅使得 linux 可以支持所有類型的文件系統(tǒng),更重要的一點,通過動態(tài)掛載和卸載文件系統(tǒng),可以明顯減少操作系統(tǒng)對資源的占有量,顯著提高操作系統(tǒng)運行效率。由于 linux 操作系統(tǒng)的完全開源性,這使得我
15、們可以有機會對 linux 系統(tǒng)內部的具體實現(xiàn)機制進行研究并加以修改,逐步完善并提升 linux 的功能。linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第一章 緒論3總的說來,對 linux 操作系統(tǒng)進行分析研究,是很有意義的,特別的是對linux 操作系統(tǒng)的精華虛擬文件系統(tǒng)進行分析研究,是很有必要的。通過分析和研究,可以設計出更加優(yōu)秀的 linux 系統(tǒng)。也可以給我們在進行其他系統(tǒng)軟件設計過程中提供許多值得借鑒的和思考的東西。同時,目前國內 linux 的普及度還不高,人們對其了解也不深,研究 linux 有助于提高我國在這一領域的技術水平,縮短同世界先進水平之間的差距。由于其開源性,對它進行研究
16、,困難程度不是很大,但意義卻很大,因為 linux 作為操作系統(tǒng)家族中的一員,我們可以通過對 linux 的研究加強自身在操作系統(tǒng)研發(fā)方面的能力,打破美國在這一核心領域的壟斷地位。linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第二章 總體規(guī)劃4第二章 總體規(guī)劃2.1 設計思路由于 linux 操作系統(tǒng)的一個重要特點就是模塊化,這些模塊可以編譯時靜態(tài)地鏈接,也可以在運行時動態(tài)鏈接,當系統(tǒng)運行需要用到某個模塊所提供的功能時,內核就臨時把該模塊從外存中加載到內存中,當不再需要這個模塊時,linux 內核又會將它卸載6。例如,通常情況下,桌面 linux 對 ntfs 文件系統(tǒng)的支持就是模塊化的,當我們沒有
17、去訪問 ntfs 文件系統(tǒng)中的內容時,內存中就沒有加載該模塊,但是,一旦掛載了 ntfs 文件系統(tǒng),其相應模塊就會被加載入內存,以支持對 ntfs 文件系統(tǒng)的操作;一旦斜載 ntfs 文件系統(tǒng)后,如果 linux系統(tǒng)中也沒有別的地方需要用到 ntfs 文件系統(tǒng),內核中的 模塊管理程序就會把該模塊從內存中清除。linux 內核對動態(tài)加載模塊的支持使得 linux 的內核可以變得很小,運行起來更加高效。而且 linux 內核具有其他很多操作系統(tǒng)不具備的功能,它可以進行重新編譯,可以進行剪裁,可以根據(jù)自己的需要進行裁減,增加自己需要的功能,刪除不需要的功能,例如在這里,我需要做一個用于管理文件系統(tǒng)的
18、小型系統(tǒng),那么我就可以通過重新編譯 linux 內核,去掉網絡,聲音,游戲,usb 設備等很多不需要的內容,而增加那些在默認情況下沒有進行支持的文件系統(tǒng)的支持。linux 內核對模塊的加載是具有“堆砌”性的7。 (其含義可以用圖 3 來說明:)比如,系統(tǒng)在運行時發(fā)現(xiàn)需要用到模塊 a,但是模塊 a 又不在內存中,那么系統(tǒng)就需要加載模塊 a,加載進來后,系統(tǒng)又發(fā)現(xiàn),模塊 a 在其實現(xiàn)過程中又用到了模塊 b 和模塊 c,那么系統(tǒng)又會自動地把模塊 b 和模塊 c 加載進來。模塊 a和模塊 b , c 的關系稱為模塊 a 位于模塊 b,c 之上(be on the top of),也稱為模塊 b,c 為
19、模塊 a 所用(be used by)。為了實現(xiàn)自動動態(tài)加載模塊,linux 為每個模塊建立了一些數(shù)據(jù)結構,這個結構體中有一個 count 成員,但 count 為 0 的時候,證明此時已經沒有進程或者別的模塊使用該模塊,系統(tǒng)將把這個模塊卸載;否則,表示該模塊正被使用,系統(tǒng)不能將它卸載。系統(tǒng)只有在 count 成員為 0 后才會把該模塊從內存中刪除。linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第二章 總體規(guī)劃5module amodule bmodule c系統(tǒng)加載模塊系統(tǒng)加載模塊 a 后,發(fā)現(xiàn)后,發(fā)現(xiàn) a 用到了用到了 b,c;而;而 b,c 都不在內存中,于都不在內存中,于是接著加載是接著加載
20、 b,c圖 2.1 linux 內核模塊的“堆砌”性一個典型的桌面 linux 系統(tǒng)包括 3 個主要的軟件層-linux 內核、c 庫和應用程序代碼8。內核是唯一可以完全控制硬件的層,內核驅動程序代表應用程序與硬件之間進行會話。內核之上是 c 庫,負責把 posix api 轉換為內核可以識別的形式,然后調用內核,從應用程序向內核傳遞參數(shù)。應用程序依靠驅動內核來完成特定的任務,但是根據(jù)實際情況,這樣做需要較大的內核,所以這里采用應用程序直接跟內核會話,這樣既可以減少內核大小,還可以提高運行速度。所以我把畢業(yè)設計的目標定在盡量對 linux 內核進行裁減,去除進程調度,內存分配等許多內容和模塊,
21、使其只剩下文件管理功能,但它應該保留虛擬文件系統(tǒng)的特征,能夠訪問多種不同格式的實際文件系統(tǒng)。而且它不需要其他操作系統(tǒng)平臺支持就可以單獨運行。此時的這個文件系統(tǒng)管理程序應該至少具有以下幾大功能: 以 linux 方式組織文件。 復制文件。 刪除文件。 編輯文件。 重命名文件。 創(chuàng)建和刪除文件夾。 掛載和卸載其他種類的文件系統(tǒng)。在具體實現(xiàn)上,我選用的 linux 內核版本為 2.4.20,這個版本發(fā)布與2002 年 11 月 28 號,之所以選擇它,因為它是公認的目前 linux 內核中最穩(wěn)定的一個高端版本,并且它的功能十分強大,這個內核版本支持幾乎所有在linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第
22、二章 總體規(guī)劃6市場上可以買到的處理器芯片;支持模塊化調用;支持各種類型的網絡;支持許多種的文件系統(tǒng);支持多種外部設備;支持即插即用設備;支持圖形用戶界面,還支持很多種新型技術:例如藍牙技術、紅外線技術、ipv6 等。2.2 實施方案我的方案就是:先利用 linux 內核重編譯技術,裁減 linux 內核,去掉linux 內核對網絡的支持,對 usb 接口的支持,對聲音的支持,對 scsi 設備的支持,對熱插拔技術的支持,對新型技術的支持等;總之:裁減之后的內核應該盡量只支持對文件的管理功能,當然,為了能正常運行,這個內核還應該支持主流的 cpu 例如 x86 系列,為了實現(xiàn)虛擬文件系統(tǒng),它還
23、應該支持 ide 接口的硬盤,支持內存管理。第二步:通過分析內核相關部分的源代碼,修改其中一些部分,這樣可以進一步縮減內核大小。這次裁減之后的新內核應該具有如下的特征:除了管理文件系統(tǒng)所需要的底層支撐功能外,其他與文件系統(tǒng)并列的其他功能都盡量去除了,它的功能就是對多種實際文件系統(tǒng)進行管理,協(xié)調它們在計算機系統(tǒng)中共存。最后一步:將這個裁減后的內核移植到一張軟盤上面,使其可以單獨運行,為了達到這個目的,我必須先為這個系統(tǒng)制作一個引導程序,然后加上一個根文件系統(tǒng)和一些用于文件系統(tǒng)的常用命令。因為我做這個系統(tǒng)的主要目的是研究 linux 中的虛擬文件系統(tǒng),所以對這個功能的支持的必須的。在虛擬文件系統(tǒng)下
24、面應該盡可能地多支持實際文件系統(tǒng),我的初步設想是至少應該包含多以下幾種文件系統(tǒng)的支持:windows 中的 fat16/32 文件系統(tǒng),windows 中使用的 ntfs 文件系統(tǒng),linux 中用的 ext2/3 文件系統(tǒng),linux 中使用的 minix 文件系統(tǒng),光盤上使用 iso9660 文件系統(tǒng),管理設備時用到的設備文件系統(tǒng)。對于其他種類的文件系統(tǒng),視軟盤的空間組織情況來決定是否提供支持。概括起來說,這個小型系統(tǒng)分為四個部分:系統(tǒng)啟動部分、系統(tǒng)內核部分、外圍程序部分、根文件系統(tǒng)。對于系統(tǒng)啟動部分:完成起來比較簡單,可以選擇使用grub,lilo,syslinux 等,也可以自己編寫,
25、鑒于時間上的關系,我決定使用 grub 進行系統(tǒng)引導,利用 grub 程序將引導程序寫入軟盤的主引導扇區(qū)(mbr)中去。對于系統(tǒng)內核部分:需要先對內核進行重新編譯,去除那些不必要的功能,增加那些對文件系統(tǒng)的支持。對于外圍程序部分:使用一個在嵌入式 linux 領域使用很廣泛的軟件busybox,它包含了一個 shell 程序和一些 linux 中常用的命令,但是它的總大小卻只有幾百 kb,而且 busybox 也同時支持動態(tài)編譯和靜態(tài)編譯,由linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第二章 總體規(guī)劃7于 busybox 并沒有包含所有的 linux 中的命令,在這里,還需要為管理文件系統(tǒng)自己添加
26、幾個命令,如 mount,umount 命令。根文件系統(tǒng)采用 ext2 文件系統(tǒng),創(chuàng)建必要的目錄和文件,然后增加一些用與系統(tǒng)初始化的腳本程序,如 inittab,fstab 文件。當把上面四個部分都準備好以后,還需要將四者組裝到一起,考慮到節(jié)省空間的問題,這里準備使用 linux 內核所支持的虛擬磁盤技術(ram disk),將外圍程序部分先進行高度壓縮,在系統(tǒng)啟動后,把內核和壓縮后的外圍程序部分都裝入內存,然后解壓外圍程序部分,然后運行。概括起來說,要做好這個小型系統(tǒng),首先要編譯出一個合適的內核,在這里,為了空間大小的關系,最好是采用靜態(tài)編譯,制作好引導程序,有了這兩步,系統(tǒng)就基本可以運行了
27、,但這時無法與用戶交互,為此,還必須有一個根文件系統(tǒng)和一個 shell,以上幾個部件都準備好以后,系統(tǒng)也就基本完成了。linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第三章 虛擬文件系統(tǒng)8第三章 對虛擬文件系統(tǒng) 的分析3.1 虛擬文件系統(tǒng) 數(shù)據(jù)結構linux vfs 提供了一種接口面向所有 linux 內核所能支持的文件系統(tǒng)。竟管各種不同操作系統(tǒng)有著不同的格式與具體實現(xiàn),但面向她們的接口保持一致。vfs 提供了一系列的數(shù)據(jù)結構和虛擬方法來訪問文件系統(tǒng)。在 vfs 層提供了一些默認的文件系統(tǒng)操作的實現(xiàn),某個具體文件系統(tǒng)覆蓋這些默認的實現(xiàn)僅僅當它需要定制自己的實現(xiàn)過程時9。因為 linux 內核是用 c
28、寫的,linux 中虛擬方法的實現(xiàn)機制與那些用面向對象語言實現(xiàn)的虛擬方法有所不同。在這里是用函數(shù)指針來實現(xiàn)虛擬函數(shù)的。3.1.1 超級塊linux vfs 中一個最重要的概念就是超級塊??偟膩砜矗墘K包含所有關于一個文件系統(tǒng)的關鍵信息。當某個文件系統(tǒng)被掛載時,超級塊將被讀(通過一個系統(tǒng)調用 filesystem_read_super)并且,超級塊包含訪問文件系統(tǒng)其他部分的必要的信息10。有些文件系統(tǒng)(例如 ms-dos fat)沒有超級塊,這時,vfs 將為他們創(chuàng)建一個“虛擬”超級塊。同時,由于在一個計算機系統(tǒng)中可能存在多個文件系統(tǒng),在虛擬文件系統(tǒng)中也就對應有多個超級塊,為了便于管理,系統(tǒng)用
29、一個雙向鏈表存儲它們。super_block 結構體定義在。出來包含關于所有文件系統(tǒng)的通用信息外,它還包含一個聯(lián)合體,這個聯(lián)合體中存放一些與某特定文件系統(tǒng)具體相關信息的結構體。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;linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第三章 虛擬文件系統(tǒng)9unsigned char s_dirty;struct
30、 file_system_type * 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;un
31、ion struct minix_sb_info minix_sb;struct ext2_sb_info ext2_sb;void *generic_sbp;u;s_list:這個成員被用來維持一個超級塊雙向鏈表,它包含 next,previous指針。s_dev:這是該文件系統(tǒng)的實際物理設備,有些文件系統(tǒng)(最著名的就是pro 文件系統(tǒng))不需要物理設備。對于那樣的文件系統(tǒng),這個成員將被忽略。s_blocksize:這個成員包含該文件系統(tǒng)的塊大小(以 byte 為單位)。s_blocksize_bits:與前一成員具有相同的值,只是它是一 bit 為單位。s_lock:這個成員被用來給超級塊加
32、鎖,從而保證對超級塊的順序訪問。s_rd_only:這個成員目前沒有用。s_dirty:這是一個標志,用來指示該超級塊是否變臟,超級塊是臟的如果從它最后一次寫入磁盤后已經發(fā)生了內容改變。s_type:這是一個指針指向這個文件系統(tǒng)的 file_system_type 目錄項。s_op:這是一個指向該文件系統(tǒng)超級塊操作集結構體的指針。dq_op:這是一個指向磁盤配額結構體的指針。s_flags:這個成員包含該文件系統(tǒng)的掛載標志,這些信息包含一些信息,比如:這個文件系統(tǒng)是否需要一個設備,或者這個文件系統(tǒng)是否以只讀方式掛載。linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第三章 虛擬文件系統(tǒng)10s_magic
33、:這是一個魔數(shù)用來標識呈現(xiàn)在設備上的文件系統(tǒng)的類型。s_time:標示超級塊最后一個被修改的時間。s_root:這是一個指向該文件系統(tǒng)跟目錄的指針。s_wait:這是一個包含當前正在等待訪問超級塊的任務的等待隊列。s_ibasket:這個成員暫時沒有用到。s_ibasket_count: 這個成員暫時沒有用到。s_ibaskte_max: 這個成員暫時沒有用到。s_dirty:這是該文件系統(tǒng)當前所有臟 i 節(jié)點所組成的鏈表。super_operartions 結構體是放在中,它實際上是一個虛擬函數(shù)表,該表包含所有用來操作超級塊的函數(shù)。每個特定的文件系統(tǒng)都希望覆蓋這些函數(shù)并提供它們自己的函數(shù)指針
34、集。struct 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_blo
35、ck *; 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:當一個索引節(jié)點從文件系統(tǒng)被讀入時這個函數(shù)被調用。這個函數(shù)負責填充索引節(jié)點結構體大多數(shù)成員(包括 inode_operation 指針)。write_inode:這個函數(shù)用來將一個索引節(jié)點寫出到磁盤中
36、。put_inode:將索引節(jié)點從索引節(jié)點高速緩存中移出。delete_inode:當某個文件被刪除時,這個函數(shù)將被調用。它將釋放文件的索引節(jié)點和數(shù)據(jù)塊并將空間歸還給內存。notify_change:當一個索引節(jié)點的屬性改變時,這個函數(shù)將被調用。put_super:當卸載一個文件系統(tǒng)釋放超級塊給內存時,這個函數(shù)將被調用。write_super:這個函數(shù)將超級快寫出到磁盤中。statfs:這個函數(shù)用來統(tǒng)計該文件系統(tǒng)的有關信息。linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第三章 虛擬文件系統(tǒng)11remount_fs:當一個文件系統(tǒng)被重新掛載時(為了改變掛載標志)將被調用。clear_inode:這個函
37、數(shù)與 delete_inode 類似,但是它是在索引節(jié)點被反散列后并且所有對它的引用被清除了后調用的。umount_begin:當 vfs 開始卸載一個文件系統(tǒng)時,這個函數(shù)將被調用。3.1.2 索引節(jié)點vfs 中另外一個重要概念就是索引節(jié)點。一個索引節(jié)點代表一個獨立的文件系統(tǒng)實體11,例如一個文件,目錄,管道,套接字。文件系統(tǒng)中的每一個實體有一個唯一的索引節(jié)點,但是通過使用硬鏈接和符號鏈接,使得通過多個名字訪問同一個實體成為現(xiàn)實。索引節(jié)點結構體也存放在中。它包含很多信息,這些信息被多種類型的文件系統(tǒng)的不同 i 節(jié)點使用。與 super_block 結構體一樣,它也包含一個聯(lián)合體(成員由與特定文
38、件系統(tǒng)相關,類型相關的結構體)。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;unsign
39、ed longi_blocks;unsigned longi_version;unsigned longi_nrpages;struct semaphorei_sem;linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第三章 虛擬文件系統(tǒng)12struct 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_pa
40、ges;struct dquot *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:這個成員用來維持一個雙向隊列以解決因為散列沖突。i_list:這個用來
41、將索引節(jié)點放到三個雙向隊列中。i_dentry:這是一個與該索引節(jié)點對應的目錄項鏈表。i_no:這是一個用來標示該索引節(jié)點的數(shù)字,它在同一個文件系統(tǒng)中保持唯一。i_count: 該索引節(jié)點的引用數(shù),當它變成 0 時,我們可以將它從內存中移出。i_dev:這是該索引節(jié)點所屬文件系統(tǒng)的物理設備標示。i_mode:這個成員包含文件類型和訪問權限。i_nlink:這是該索引節(jié)點的硬鏈接數(shù),如果它為 0,該索引節(jié)點可以刪除了。i_uid:該索引節(jié)點的主人的 user id。i_gid: 該索引節(jié)點的主人的 group id。i_rdev:如果該索引節(jié)點是一個設備文件對應的 i 節(jié)點,它就是該設備標lin
42、ux 環(huán)境下虛擬文件系統(tǒng)分析研究 第三章 虛擬文件系統(tǒng)13示。i_size:該索引節(jié)點對應的文件的字節(jié)數(shù)。i_atime:上次訪問的時間。i_mtime:上次修改的時間。i_ctime:文件創(chuàng)建的時間。i_blksize:文件系統(tǒng)每個塊的字節(jié)數(shù)。i_blocks:文件所含有塊數(shù)。i_version:用來檢查失效信息,當索引節(jié)點出現(xiàn)相關變化時,它將被更新。i_nrpages:當前實際用來映射該文件的內存頁數(shù)。i_sem:這是一個信號量,它用來控制對索引節(jié)點的訪問,阻止在讀的時候對 i 節(jié)點進行修改。i_atomic_write:它用來標記一個對管道的原子性寫操作正在被請求。它必須在獲得其他通用索
43、引節(jié)點信號量前完成。i_op:這是一個指向該索引節(jié)點操作集的指針。i_sb:指向該索引節(jié)點所屬文件系統(tǒng)的超級塊的指針。i_wait:這是一個等待隊列,該隊列包含所有因訪問該索引節(jié)點而等待的任務,當該 i 節(jié)點變的可用時,這些任務將會被通知。i_flock:這是一個文件鎖鏈表,文件鎖被同時保存在每個索引節(jié)點的單向鏈表和系統(tǒng)為所有文件鎖所設立的雙向鏈表中。i_mmap:指向用來映射該文件的內存區(qū)域。i_pages:該文件所對應內存頁鏈表。i_dquot:磁盤配額信息。i_state:用來標示該索引節(jié)點的當前狀態(tài),有關于該索引節(jié)點是否變臟,是否被鎖,是否存在與一個已經被釋放的進程中等標志。i_fla
44、gs:標示索引節(jié)點的的屬性,當前屬性包括:文件不變性,異步寫,不更新文件訪問時間,文件是追加,該文件的配額被初始化。i_pipe: 表示這個索引節(jié)點代表一個管道文件。i_sock: 表示這個索引節(jié)點代表一個套接字文件。i_writecount:為負表示寫不允許,為正表示當前正在被寫,為 0 表示其他情況。i_attr_flags:文件的屬性信息,目前與 i_flags 相似。inode_operations 結構體同樣存在與中。它同樣是一個虛函數(shù)表包含操作 i 節(jié)點的函數(shù)。每個具體的文件系統(tǒng)不是只提供一組 i 節(jié)點操作,她們通常提供一些不同的操作針對與不同的 i 節(jié)點類型(目錄,文件,管lin
45、ux 環(huán)境下虛擬文件系統(tǒng)分析研究 第三章 虛擬文件系統(tǒng)14道,套接字)。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 *
46、;int (*symlink) 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)
47、struct 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
48、 (*smp) struct inode *,int ; int (*updatepage) struct file*,struct page *,unsigned long,unsigned int ,int; int (*revalidate) struct dentry *;default_file_ops:這是一些默認的文件操作用來打開一個文件,打開操作會根據(jù)文件類型提供恰當?shù)牟僮?。create:用來創(chuàng)建一個新的索引節(jié)點。lookup:該函數(shù)用來查找目錄項并返回對應的索引節(jié)點,此操作只提供給目錄。 link:用來建立一個硬鏈接,從一個目錄項到一個特定索引節(jié)點,在執(zhí)行操作之前必須進行檢查
49、以保證硬鏈接與原文件在同一個文件系統(tǒng)中。 unlink:從一個文件系統(tǒng)中刪除一個索引節(jié)點。 symlink:建立一個目錄項到某索引節(jié)點的符號鏈接。 linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第三章 虛擬文件系統(tǒng)15mkdir:建立一個子目錄。rmdir:刪除一個特定子目錄。 mknode:用來創(chuàng)建一個設備文件,命名管道,套接字。 rename:通過刪除原目錄項,建立新目錄項來改變一個文件的名字。 readlink:用來出來一個有符號鏈接所指向的文件。 readpage:被內存映象文件用來讀取一頁進入內存。writepage: 被內存映象文件用來寫一頁到磁盤中。bmp:用來將文件中某塊映射到調用者
50、的地址空間中。truncate:用來調整文件的長度,它可以縮短或者提升文件的長度。permission:檢查某個特定 i 節(jié)點的的訪問權限。smp:與 bmp 類似,只是它以扇區(qū)為單位。updatepage:與 writepage 類似,但是它會做附加的檢查來看是否真需要寫。revalidate:用來保證某個文件的高速緩存是最新的。3.1.3 文件vfs 中第三個重要對象就是文件了。任何時候,當一個進程打開一個文件,一個新的文件對象就創(chuàng)建了,這就意味著多個文件對象可以對應與同一個物理的文件。并且允許多個進程(或者同一個進程)去同時訪問一個文件的不同部分12。文件結構體,同樣也存在與比 supe
51、r_block 結構體和 inode 結構體要簡單。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;
52、f_next,f_pprev:用來實現(xiàn)一個雙向的文件結構體鏈表。f_dentry:目錄項(我們通過這個目錄項打開對應的文件)。linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第三章 虛擬文件系統(tǒng)16f_op:指向文件操作表的指針。f_mode:包括該文件的訪問權限。f_pos:存放目前文件的偏移量的指針fcount:該文件的引用次數(shù)。f_flags:包含一些標志:是否打開為讀,是否打開為寫,是否寫之前清空。f_reada:一個標志用來指示是否使用提前讀。f_ramax:當前的提前讀的最大頁面數(shù)。f_raend:指向提前讀入的頁面之后的頁面中第一個字節(jié)。f_ralen:提前讀入的最后一塊的大小。f_ra
53、win:目前的提前讀窗口大小。f_ower:這個結構體包括:用戶 id,進程 id,它還包括異步 i/o 中發(fā)送給進程的實時信號(該信號用來通知進程,文件已經準備好 i/o)。f_version:用來檢查失效信息,當一個對文件的改變發(fā)生后,它被更新。private_data:指向一些不透明數(shù)據(jù)的指針,vfs 將保留但不訪問這個指針。file_operations 結構體定義在,同樣,它是一個虛函數(shù)表包含用來操作文件的函數(shù)。struct file_operations loff_t (*llseek) struct file *,loff_t,int;ssize_t (*read) struct
54、 file *,char *,size_t,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
55、_struct *;int (*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 f
56、ile_lock *;linux 環(huán)境下虛擬文件系統(tǒng)分析研究 第三章 虛擬文件系統(tǒng)17llseek 負責設置文件的當前偏移量指針。:read:將文件中的數(shù)據(jù)復制到特定緩沖區(qū)。write:將緩沖區(qū)中的數(shù)據(jù)寫入文件指針所指的位置。readdir:從目錄中讀取下一個目錄項。poll:檢查目前是否可以將數(shù)據(jù)讀入或者寫出。ioctl:用來設置和讀取設備文件。mmap:將文件中的一個扇區(qū)映射到當前進程的用戶地址空間。open:當一個文件被打開是這個函數(shù)被調用。flush:當 vfs 關閉一個文件時將調用這個函數(shù)。release:當一個文件的引用計數(shù)器為 0 且即將從內存中移出時此函數(shù)被調用。fsync:用
57、來保證一個文件所有被修改的緩沖區(qū)都被寫回磁盤。fasync:用來打開或者關閉異步文件更新機制。check_media_change:這個函數(shù)只用在支持移動介質的塊設備,它檢查從上次訪問后介質是否有改變。revalidate:這個函數(shù)只用在塊設備上,當設備介質改變后它將被調用來更新必要的設備參數(shù)。lock:用來在一個文件上獲取文件鎖。3.2 文件系統(tǒng)高速緩存為了提高文件系統(tǒng)的性能,linux 提供兩中文件系統(tǒng)高速緩存,緩沖區(qū)高速緩存用來暫存那些正在讀取或者寫入到某文件的數(shù)據(jù),目錄高速緩存(dcache)暫存目錄項信息,從而提高了文件查找的效率13。3.2.1 緩沖區(qū)高速緩存緩沖區(qū)高速緩作為一個接
58、口存在與文件系統(tǒng)和實際物理設備之間,當一個文件系統(tǒng)想從一個設備中讀取或者想向一個設備寫入數(shù)據(jù)時,它將調用一些為緩沖區(qū)高速緩設置的函數(shù),緩沖區(qū)高速緩存所隱含的主要思想是把進程從存取慢速磁盤數(shù)據(jù)的等待中解放出來。因此,如果同時寫入太多數(shù)據(jù),結果反而是欲速則不達。反之,可以把數(shù)據(jù)劃分成小片并周期性地寫入磁盤,以使 i/o 操作對用戶進程速度的影響最小,用戶所感受的響應時間最小。內核為每一個緩沖區(qū)維護很多信息,這些信息用來緩和寫操作,這些信息包括一個“臟(dirty) ”位,表示內存中的緩沖區(qū)已經被修改,必須寫到磁盤中去,還包括一個時間標志,表示緩沖區(qū)被刷新到磁盤之前在內存中停linux 環(huán)境下虛擬文
59、件系統(tǒng)分析研究 第三章 虛擬文件系統(tǒng)18留了多長的時間。緩沖區(qū)高速緩存的大小可以變化。當需要新緩沖區(qū)而現(xiàn)在又沒有可用緩沖區(qū)時,頁框按需要被分配。當空閑內存變得不足時,就釋放緩沖區(qū)并反復使用相應的頁框。緩沖區(qū)數(shù)據(jù)結構中一個重要域就是 b_count,它是對應緩沖區(qū)所使用的一個引用計數(shù)器,在對緩沖區(qū)操作之前加 1,操作之后減 1。它主要起到安全所的作用,因為只要引用計數(shù)器不為 0,內核就永遠不會撤銷這個緩沖區(qū)。相反,內核會周期性或在空閑內存不足的時候檢測已用緩沖區(qū),只有那些引用計數(shù)器為 0 的緩沖區(qū)才能被撤銷,也就是說,雖然引用計數(shù)器為 0 是一個緩沖區(qū)可以屬于緩沖區(qū)高速緩存,但是,不能確定這個緩
60、沖區(qū)在高速緩存中可以存在多長時間。緩沖區(qū)高速緩存包括兩種數(shù)據(jù)結構14: 描述高速緩存中緩沖區(qū)的一組緩沖區(qū)首部。緩沖區(qū)首部描述了與一對給定的設備號和塊號相關的緩沖區(qū)。 有助于內核快速找到緩沖區(qū)首部的散列表。通常情況下,緩沖區(qū)首部可能為以下狀態(tài)之一。 未用的緩沖區(qū)首部:該對象是可用的,但其域中的值沒有什么意義。 空閑緩沖區(qū)的緩沖區(qū)首部:其 b_data 域指向一個空閑緩沖區(qū),而 b_dev 域的值是 b_free,其實這個時候,這個緩沖區(qū)是可用的,但其緩沖區(qū)首部本身是不可用的。 已用緩沖區(qū)的緩沖區(qū)首部:其 b_data 域指向一個存放緩沖區(qū)高速緩沖中緩沖區(qū)。 異步緩沖區(qū)首部:其 b_data 域指
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新型農業(yè)用地承包與轉讓合同協(xié)議3篇
- 2025石材資源開發(fā)與承包管理服務協(xié)議3篇
- 2025年度智能家居系統(tǒng)設計與安裝服務合同3篇
- 個人日常運營資金貸款協(xié)議范本版B版
- 二零二五年貨物采購合同(食品)
- 2025版兄弟姐妹房產分配及分割協(xié)議書范本3篇
- 個人信用評估服務合同2024年度范本datainputs3篇
- 二零二五年戰(zhàn)略性新興產業(yè)項目投標管理制度合同3篇
- 二零二五年度美團打車出行安全保障及應急處理合同4篇
- 長沙醫(yī)學院《中國古代文學作品選讀2》2023-2024學年第一學期期末試卷
- 寒假作業(yè)一年級上冊《數(shù)學每日一練》30次打卡
- 2024-2025學年九年級化學上冊 第二單元 單元測試卷(人教版)
- 2024年公共衛(wèi)生基本知識考試題庫(附含答案)
- 2024多級AO工藝污水處理技術規(guī)程
- 2024年江蘇省鹽城市中考數(shù)學試卷真題(含答案)
- DZ∕T 0287-2015 礦山地質環(huán)境監(jiān)測技術規(guī)程(正式版)
- 2024年合肥市廬陽區(qū)中考二模英語試題含答案
- 質檢中心制度匯編討論版樣本
- 藥娘激素方案
- 提高靜脈留置使用率品管圈課件
- GB/T 10739-2023紙、紙板和紙漿試樣處理和試驗的標準大氣條件
評論
0/150
提交評論