ext2文件系統(tǒng)跟蹤程序的設(shè)計與實現(xiàn)【畢業(yè)設(shè)計+開題報告+文獻綜述】_第1頁
已閱讀1頁,還剩45頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  本科畢業(yè)設(shè)計(論文)</p><p><b> ?。ǘ?屆)</b></p><p>  EXT2文件系統(tǒng)跟蹤程序的設(shè)計與實現(xiàn)</p><p>  所在學(xué)院 </p><p>  專業(yè)班級 計算機科學(xué)與技術(shù) </

2、p><p>  學(xué)生姓名 學(xué)號 </p><p>  指導(dǎo)教師 職稱 </p><p>  完成日期 年 月 </p><p>  摘要:Linux操作系統(tǒng)是20世紀(jì)90年代推出的一個多用戶任務(wù)操作系統(tǒng),它與UNIX兼

3、容,有UNIX最新的全部功能。Linux操作系統(tǒng)功能強大、性能穩(wěn)定、便于使用,其最大的特點之一就是對很多種文件系統(tǒng)的支持,包括ext,ext2,minix,ncp,xia,fat,hpfs,msdos,vfat,smb,affs以及ufs等。其中EXT2文件系統(tǒng)是Llinux操作系統(tǒng)配置的標(biāo)準(zhǔn)文件系統(tǒng),其結(jié)構(gòu)與UNIX的文件系統(tǒng)極為類似。本課題在Linux環(huán)境下編寫一個EXT2文件系統(tǒng)跟蹤程序,實現(xiàn)EXT2文件系統(tǒng)關(guān)鍵數(shù)據(jù)結(jié)構(gòu)的顯示任務(wù)

4、:完成超級塊數(shù)據(jù)結(jié)構(gòu)每個字段信息的顯示;顯示每塊組數(shù)據(jù)結(jié)構(gòu)字段的信息;根據(jù)輸入的路徑顯示指定目錄下所有文件的目錄數(shù)據(jù)結(jié)構(gòu)字段信息;根據(jù)輸入的文件的I節(jié)點號顯示其I節(jié)點數(shù)據(jù)結(jié)構(gòu)字段信息。</p><p>  關(guān)鍵詞: Linux操作系統(tǒng);EXT2文件系統(tǒng);數(shù)據(jù)結(jié)構(gòu)</p><p>  Design and Implementation of </p><p>  EX

5、T2 File System Tracking Program</p><p>  Abstract:Linux operating system is the 1990s the release of a multi-user task with UNIX operating system, and its latest compatibility, all of the functions of a UNIX

6、. Linux operating system powerful, stable performance, easy to use, one of its biggest characteristic is to a variety of file system support, including the ext ext2, ncp, minix, fat, hpfs, msdos, vfat, smb, affs and ufs

7、 and so on. Among them EXT2 file system is Llinux operating system configuration of standard file systems, its str</p><p>  Keywords: Linux operating system; EXT2 file system; data structure</p><p

8、><b>  目錄</b></p><p><b>  1 緒論1</b></p><p>  1.1 課題研究背景1</p><p>  1.1.1 操作系統(tǒng)文件系統(tǒng)及其功能1</p><p>  1.1.2 Linux文件系統(tǒng)3</p><p>  

9、1.1.3 Linux文件系統(tǒng)的發(fā)展與興起5</p><p>  1.1.4 EXT2文件系統(tǒng)的構(gòu)造7</p><p>  1.2 課題研究的基本思想8</p><p>  1.3 課題研究的目的與意義9</p><p>  1.4 研究的方法與技術(shù)路線、研究難點,預(yù)期達(dá)到的目標(biāo)9</p><p>

10、  2 開發(fā)環(huán)境與開發(fā)工具10</p><p>  2.1 Red Hat 9.0簡介10</p><p>  2.2 Gcc10</p><p>  2.2.1 Gcc概括10</p><p>  2.2.2 基本規(guī)則11</p><p>  2.2.3 基本用法11</p>&

11、lt;p>  2.3 Vi12</p><p>  2.3.1 Vi編輯器的工作模式12</p><p>  2.3.2 進入插入模式12</p><p>  2.3.3 末行模式下的常用命令12</p><p>  3 系統(tǒng)設(shè)計與實現(xiàn)14</p><p>  3.1 系統(tǒng)設(shè)計思想14&l

12、t;/p><p>  3.2 系統(tǒng)實現(xiàn)14</p><p>  3.2.1 main()函數(shù)14</p><p>  3.2.2 super()函數(shù)16</p><p>  3.2.3 show_group()函數(shù)17</p><p>  3.2.4 directory()函數(shù)20</p>

13、<p>  3.2.6 Makefile文件24</p><p>  3.3 運行結(jié)果25</p><p>  3.3.1 系統(tǒng)菜單顯示25</p><p>  3.3.2 超級塊數(shù)據(jù)結(jié)構(gòu)顯示26</p><p>  3.3.3 文件系統(tǒng)塊位圖顯示27</p><p>  3.3.4

14、路徑顯示28</p><p>  3.3.5 文件內(nèi)容顯示29</p><p>  4 總結(jié)及展望30</p><p>  致 謝錯誤!未定義書簽。</p><p><b>  參考文獻31</b></p><p><b>  1 緒論</b></p&

15、gt;<p>  1.1 課題研究背景</p><p>  1.1.1 操作系統(tǒng)文件系統(tǒng)及其功能</p><p>  在早期,對文件的管理和使用是相當(dāng)復(fù)雜和繁瑣的,由于文件放在外存儲器中,為了管理和使用文件,無論是系統(tǒng)還是用戶都是十分熟悉外存的物理特性,并且需要記住外存空間的利用狀況和文件在外存上的分布情況,還是知道文件在外存的物理地址。這對用戶無疑是一個沉重的負(fù)擔(dān),也給

16、系統(tǒng)帶來了不安全因素。特別是在多道系統(tǒng)中,如果由用戶直接管理和存取外存中的文件,必然出現(xiàn)不同用戶之間外存區(qū)域的交叉訪問,從而不能保證系統(tǒng)和用戶的信息安全。所以,現(xiàn)代計算機系統(tǒng)都把設(shè)置了一個統(tǒng)一的公共信息管理機構(gòu),由它復(fù)負(fù)責(zé)管理外存的文件存儲空間,提供文件在外存中的組織方式,以及控制文件的存取等。這樣的機構(gòu)就是操作系統(tǒng)中的文件管理系統(tǒng),簡稱文件系統(tǒng)(file system)[8]。</p><p>  因此文件系統(tǒng)

17、的定義就是在操作系統(tǒng)中負(fù)責(zé)管理和存儲文件信息的軟件機構(gòu)。文件系統(tǒng)由三部分組成:與文件管理有關(guān)的軟件、被管理的文件以及實施文件管理所需的數(shù)據(jù)結(jié)構(gòu)。從系統(tǒng)角度來看,文件系統(tǒng)是對文件存儲器空間進行組織和分配,負(fù)責(zé)文件的存儲并對存入的文件進行保護和檢索的系統(tǒng)。具體地說,它負(fù)責(zé)為用戶建立文件,存入、讀出、修改、轉(zhuǎn)儲文件,控制文件的存取,當(dāng)用戶不再使用時撤銷文件等。不同的操作系統(tǒng)有著各自的不同的文件系統(tǒng),如windows、ext2,、minix、s

18、ysv等。</p><p>  文件系統(tǒng)是操作系統(tǒng)的重要組成部分,它為系統(tǒng)本身及計算機用戶在管理和使用文件信息上的提供了極大地方便。對用戶而言,文件系統(tǒng)允許用戶按自己的需要,按照文件系統(tǒng)的規(guī)則來定義文件結(jié)構(gòu)和使用文件,面對系統(tǒng),文件系統(tǒng)則將用戶的需要轉(zhuǎn)換成對文件的管理和控制操作。文件系統(tǒng)的功能主要有以下4個方面。</p><p><b> ?。?)文件組織</b>&l

19、t;/p><p>  文件組織提供了文件信息的組織結(jié)構(gòu)。面向用戶,系統(tǒng)提供了用戶組織文件信息的結(jié)構(gòu)方式,稱為文件的邏輯結(jié)構(gòu)。用戶可以按照流式文件的邏輯結(jié)構(gòu)把文件信息看做是一個有序的數(shù)據(jù)流,也可以按照記錄式文件的邏輯結(jié)構(gòu)把信息組織成記錄,以記錄為單位管理文件的信息。</p><p>  面向系統(tǒng),根據(jù)存儲設(shè)備的特點把文件信息按照一定的組織結(jié)構(gòu)存放在外存空間,稱為文件的物理組織。不同的物理組織方式

20、形成了不同物理結(jié)構(gòu)的文件:連續(xù)文件、鏈接文件和索引文件,根據(jù)文件的物理組織,系統(tǒng)可以有效的分配和回收文件的存取空間,準(zhǔn)確的確定文件的存放位置。</p><p><b> ?。?)文件存取</b></p><p>  在需要處理文件必須把它從外存?zhèn)魉偷絻?nèi)存空間的過程稱為取文件;當(dāng)文件處理完畢需要把它放回外存的過程稱為存文件。文件系統(tǒng)提供了若干對文件的存取方法,主要有順序

21、存取、隨機存取和直接存取。</p><p><b>  (3)文件使用</b></p><p>  文件系統(tǒng)對用戶提供了文件操作的統(tǒng)一接口,它們是用戶使用文件的界面,界面主要有兩種:一是由用戶通過命令來操作和管理文件,稱為文件操作的命令界面;另一種則是在程序設(shè)計中使用操作系統(tǒng)提供的系統(tǒng)調(diào)用來使用文件,稱為文件操作的程序界面。</p><p>&

22、lt;b> ?。?)文件控制</b></p><p>  從邏輯控制上,文件系統(tǒng)提供了對文件的訪問權(quán)限。用用戶或用戶組必須按照訪問權(quán)限使用文件。在物理控制上,系統(tǒng)設(shè)置了文件的保護級別和訪問文件時的檢查保護機制。與此同時,為了共享系統(tǒng)的信息資源,必須允許多個用戶可以同時使用某些文件,文件系統(tǒng)要控制用戶對共享文件的使用,包括不同用戶對共享文件的訪問權(quán)限和操作限制,記錄共享某個文件的用戶進程數(shù)目等。&

23、lt;/p><p>  綜上所述,文件系統(tǒng)的功能如圖1-1所示。 </p><p>  1.1.2 Linux文件系統(tǒng)</p><p>  Linux操作系統(tǒng),是一套自由使用(一般可以免費使用)和自由傳播的類Unix操作系統(tǒng)。這個系統(tǒng)是由世界各地的成千上萬的程序員設(shè)計和實現(xiàn)的。其目的是建立不受任何商品化軟件的版權(quán)制約、全世界都能自由使用的UNIX兼容產(chǎn)品。</p

24、><p>  其中Linux文件系統(tǒng)繼承了UNIX的特點,它采用了樹形目錄結(jié)構(gòu),并把文件目錄分解成目錄和基本目錄,有效的提高了文件搜索的速度。Linux處理的文件種類十分的簡單,它把設(shè)備視為文件,設(shè)備與文件使用統(tǒng)一的接口進行處理。</p><p>  1.Linux文件系統(tǒng)的樹形結(jié)構(gòu)</p><p>  Linux文件系統(tǒng)采用了多級的樹形層次結(jié)構(gòu)。樹形結(jié)構(gòu)的最上層是根目

25、錄,用/表示。在根目錄之下的是各層目錄和文件。系統(tǒng)在運行中可以通過使用命令或系統(tǒng)調(diào)用進入任何一層目錄,這時系統(tǒng)所處的目錄稱為當(dāng)前目錄。</p><p>  Linux使用絕對路徑和相對路徑來表示文件或目錄的位置。絕對路徑是從根目錄開始從上到下的依次指出各層目錄的名字,之間用”/”分隔。相對路徑是從當(dāng)前目錄開始,指定其下層各個文件及目錄。</p><p>  Linux采用目錄文件的形式管理

26、目錄,每一個目錄是一個駐留在磁盤上的目錄文件。</p><p>  Linux采取了目錄分解的方法管理文件目錄。字樹型目錄中的目錄項是文件的符號目錄。它的基本目錄是一個稱為i節(jié)點的結(jié)構(gòu)體,稱為Inode號。Linux符號目錄目錄項只由兩部分組成:文件名和Inode號。</p><p>  文件系統(tǒng)中包括大量的文件,在對文件作各種處理中,必須找到文件的位置,所以文件檢索式文件處理中十分頻繁的

27、操作,因此文件檢索的速度就稱為決定文件系統(tǒng)質(zhì)量的主要因素。在檢索文件中,主要是根據(jù)給定路徑中各個分量的名字逐項與各級樹型目錄中的目錄項進行比較。所以,實際上文件檢索的大量工作是進行名字的比較,只在找到名字相符的目錄項后,才需要使用該目錄或文件的管理信息。</p><p>  2. Linux文件的類型</p><p>  Linux操作系統(tǒng)可以處理的文件種類十分簡單,從文件本身的形態(tài)分為以

28、下幾種類型:</p><p><b> ?。?)普通文件</b></p><p>  普通文件是計算機用戶和操作系統(tǒng)用于存放數(shù)據(jù)、程序等信息的文件。</p><p><b>  (2)目錄文件</b></p><p>  目錄文件是是文件系統(tǒng)中一個目錄所包含的目錄項組成的文件。</p>

29、<p><b>  (3)設(shè)備文件</b></p><p>  設(shè)備文件時用于與I/O設(shè)備提供連接的一種文件,分為字符設(shè)備文件和塊設(shè)備文件,分別對應(yīng)于字符設(shè)備和塊設(shè)備。</p><p><b> ?。?)管道文件</b></p><p>  管道文件主要用于在進程間傳遞數(shù)據(jù)。</p><p&

30、gt;<b> ?。?)鏈接文件</b></p><p>  鏈接文件實際上是不存在的,它僅是指向另一個實際存在的原始文件。</p><p>  從對文件內(nèi)容處理的角度,無論是哪種類型的文件,Linux都把它們看做事無結(jié)構(gòu)的流式文件,即把文件的內(nèi)容看作是一系列有序的字符流,對文件的內(nèi)容和結(jié)構(gòu)是由應(yīng)用程序進行解釋的。</p><p>  3. L

31、inux文件系統(tǒng)的特點:</p><p> ?。?)支持多種不同的文件系統(tǒng)</p><p>  目前,Linux支持的文件系統(tǒng)有:ext、ext2、ext3、minix、ncp、以及ufs等。每一種文件系統(tǒng)都代表整個系統(tǒng)結(jié)構(gòu)的一部分,這種結(jié)構(gòu)很靈活,使得不同的文件系統(tǒng)能夠很好地共存。</p><p> ?。?)系統(tǒng)內(nèi)核注冊文件系統(tǒng)當(dāng)作一個模塊。通過ker_neld和

32、insmod命令向注冊表登記它的類型。</p><p>  向系統(tǒng)內(nèi)核注冊文件系統(tǒng)的類型有兩種途徑:一是在編譯內(nèi)核系統(tǒng)時確定的 ,并在系統(tǒng)初始時通過內(nèi)嵌的函數(shù)調(diào)用向注冊表登記;二是利用Linux的模塊的特點,把某個文件系統(tǒng)</p><p>  (3)提供虛擬文件系統(tǒng)</p><p>  在EXT2文件系統(tǒng)開發(fā)過程中,引入了一個非常重要的概念,即虛擬文件系統(tǒng)(VFS)

33、。Linux能支持各種文件系統(tǒng)是通過VFS來實現(xiàn)的。Linux的虛擬文件系統(tǒng)層允許同時透明地安裝許多不同的文件系統(tǒng)。對VFS來說,它一方面要高速和高效地存取系統(tǒng)文件,另一方面還要保證文件和數(shù)據(jù)能夠正確保存。</p><p><b>  (4)目錄結(jié)構(gòu)</b></p><p>  Linux操作系統(tǒng)中,文件系統(tǒng)的目錄組織是一個樹形結(jié)構(gòu),從根節(jié)點到葉子稱為文件的路徑名,文

34、件可以由其路徑名惟一確定。</p><p><b>  4.文件的訪問權(quán)限</b></p><p>  由于linux是一個多用戶多進程操作系統(tǒng),多個用戶以及系統(tǒng)本身的文件都置于同一個系統(tǒng)中。為了保證文件信息的安全,linux設(shè)置了文件保護機制,其中之一就是給不論哪種類型的文件都設(shè)置了一定的訪問權(quán)限。當(dāng)文件被訪問時,系統(tǒng)首先檢驗訪問者的權(quán)限,只有當(dāng)訪問者的權(quán)限與文件設(shè)

35、置的訪問權(quán)限相符時才允許對文件進行訪問。Linux文件訪問權(quán)限體現(xiàn)于兩個方面:限定訪問者的身份和限制對文件的操作。同時,linux文件設(shè)置了三種針對訪問者身份的權(quán)限:文件所有者、與文件所有者同組的用戶、其它用戶。在一個文件的文件說明中記錄著允許訪問該文件的文件所有者用戶標(biāo)識和用戶組標(biāo)識。</p><p>  對文件的訪問限制主要體現(xiàn)在對文件的3種操作上,即文件的讀取、寫入和執(zhí)行。對這三種訪問者的3種操作限制形成了

36、9種情況,用9位二進制代碼表示的話,如下所示:</p><p>  這個9位二進制代碼稱為文件的訪問的訪問權(quán)限代碼,其中每3位一組,一次表示所有者、同組用戶和其它用戶的讀取、寫入和執(zhí)行的權(quán)限。</p><p>  1.1.2 Linux文件系統(tǒng)的發(fā)展與興起</p><p>  Linux 是一種類Unix操作系統(tǒng),它最初是以Minix為基礎(chǔ)開發(fā)的,所以早期的Lin

37、ux引進的是Minix文件系統(tǒng)[8]。但是Minix有兩個重要的限制:其文件名最長不能超過14 個字符且塊地址最多只能存放16 位整數(shù)(2 個字節(jié)),因此最大的文件不超過64MB。為了解決這些限制,并把它們加入新的Linux內(nèi)核中,于是提出VFS(虛擬文件系統(tǒng))。VFS最初是由Chris Provenzano編寫,然后被Linus Torvalds的改寫整合嵌入Linux內(nèi)核。VFS使得Linux可以支持多個不同的文件系統(tǒng),每個表示一個

38、VFS 的通用接口。由于軟件將Linux 文件系統(tǒng)的所有細(xì)節(jié)進行了轉(zhuǎn)換,所以Linux核心的其它部分及系統(tǒng)中運行的程序?qū)⒖吹浇y(tǒng)一的文件系統(tǒng)。Linux 的虛擬文件系統(tǒng)允許用戶同時能透明地安裝許多不同的文件系統(tǒng)。</p><p>  在VFS被加人內(nèi)核,并于1992年4月開發(fā)出了第一個專門為Linux設(shè)計的文件系統(tǒng)被稱為擴展文件系統(tǒng)(Extended File System)或EXT,被正式加入到Linux0.96

39、c版本中[8]。在性能上比Minix有了較大的提高,解除了Minix的兩個大的限制,如文件名最多可以使用256個字符,文件最大長度可達(dá)2GB[8],但是EXT文件系統(tǒng)仍存在不少的問題,如處理速度不如Minix,不支持?jǐn)?shù)據(jù)時間戳的修改等問題。這一文件系統(tǒng)使用鏈接表來追蹤空閑塊和空閑的inode,這也使此文件系統(tǒng)產(chǎn)生了一些負(fù)面影響:一旦此文件系統(tǒng)被使用過,這些鏈接表就會變得混亂,而且文件系統(tǒng)也變得支離破碎。</p><p

40、>  對于上述問題,1993年1月的alpha版本中出現(xiàn)了兩個新的文件系統(tǒng)——XIA文件系統(tǒng)和第二代擴展文件系統(tǒng)(EXT2)。XIA文件系統(tǒng)主要基于MINIX 文件系統(tǒng)內(nèi)核代碼,在之前的文件系統(tǒng)上增加了一些新的改進。它基本上提供了長文件名、支持大磁盤和3個時間戳的特性。</p><p>  EXT2 文件系統(tǒng)在EXT文件系統(tǒng)的基礎(chǔ)上,進行代碼重組和許多改進[13]。它在思想上進行了前所未有的演變,并為以后的

41、改進留下很大的空間。當(dāng)這兩文件系統(tǒng)首次發(fā)布時,它們的特點基本上一樣。但XIA文件系統(tǒng)在設(shè)計時著重于小型化,因此XIA 文件系統(tǒng)比EXT2 文件系統(tǒng)更穩(wěn)定。但是隨著文件系統(tǒng)被廣泛使用, EXT2 文件系統(tǒng)逐漸地修復(fù)了一些BUG,越來越多的新功能也被添加上去了,集成了一些新的特性?,F(xiàn)在EXT2文件系統(tǒng)已經(jīng)非常穩(wěn)定,并成為Linux 操作系統(tǒng)的標(biāo)準(zhǔn)文件系統(tǒng)。</p><p>  EXT2在速度和CPU利用率上較為突出,

42、既可以用于標(biāo)準(zhǔn)的塊設(shè)備,也可應(yīng)用在軟盤等移動存儲器上。EXT2是GNU/Linux系統(tǒng)中標(biāo)準(zhǔn)的文件系統(tǒng)。它存取文件的性能極好,對于中、小型的文件更顯示出優(yōu)勢。EXT2可以堅持256B的長文件名,其單一文件大小和文件系統(tǒng)本身的容量上限與文件系統(tǒng)本身的簇大小有關(guān)。但是,EXT2也存在一些問題。由于它的設(shè)計者主要考慮的是文件系統(tǒng)性能方面的問題,而在寫入文件內(nèi)容的同時,并沒有寫入文件的meta-data(和文件有關(guān)的信息,例如權(quán)限、所有者、創(chuàng)造

43、和訪問時間)[10]。</p><p>  隨著Linux系統(tǒng)的不斷發(fā)展,所支持的文件系統(tǒng)也在迅速擴充,特別是Linux2.4內(nèi)核正式的推出,出現(xiàn)了大量的文件系統(tǒng)[8]。在2001年之前,EXT2一直是Linux的標(biāo)準(zhǔn)文件系統(tǒng)。之后,選擇就比較多了:兼容EXT2的EXT3,ReiserFS。SGI公司移植到Linux的XFS文件系統(tǒng),IBM開發(fā)的JFS。鑒于種種原因,從Red Hat Linux7.2發(fā)布版本開始

44、,Linux默認(rèn)的文件系統(tǒng)為EXT3文件系統(tǒng)。EXT3直接從EXT2文件系統(tǒng)發(fā)展而來,它不僅繼承了EXT2的全部優(yōu)點,還在可用性、完整性、速度和易于遷移四個方面表現(xiàn)突出。EXT3還采用了日志技術(shù),在系統(tǒng)突然發(fā)生故障的情況下,可以大大提高文件系統(tǒng)的可靠性。 而EXT3最大的缺點是沒有現(xiàn)代文件系統(tǒng)所具有的能提高文件數(shù)據(jù)處理速度和解壓的高性能,另外使用EXT3文件系統(tǒng)時要注意硬盤限額問題[9]。于是便催生了EXT4。EXT4在性能、伸縮性和可

45、靠性方面進行了大量的改進,并引用了很多新的技術(shù)(如:使用區(qū)段(EXTENT)來管理塊和塊管理相關(guān)的特性——延遲分配技術(shù)等),還改進了對大文件的訪問效率,在使用4KB大小的數(shù)據(jù)塊時,EXT4</p><p>  2.6.28 內(nèi)核發(fā)布時,ext4 結(jié)束了開發(fā)版,開始接受用戶的使用。似乎 ext4 就將成為 Linux 文件系統(tǒng)的代名詞。然而當(dāng)您閱讀很多有關(guān)ext4的文章時,會發(fā)現(xiàn)都不約而同地提到了Btrfs,并認(rèn)為

46、 ext4 將是一個過渡的文件系統(tǒng)。ext4的作者 Theodore Tso也盛贊 Btrfs 并認(rèn)為Btrfs將成為下一代 Linux 標(biāo)準(zhǔn)文件系統(tǒng)。Oracle,IBM, Intel 等廠商也對 Btrfs 表現(xiàn)出了極大的關(guān)注,投入了資金和人力。</p><p>  在Kevin Bowling看來,ext2/3 等文件系統(tǒng)屬于”古典時期”。文件系統(tǒng)的新時代是2005年由Sun公司的ZFS開創(chuàng)的。ZFS代表”

47、last word in file system”,意思是此后再也不需要開發(fā)其他的文件系統(tǒng)了。ZFS的確帶來了很多嶄新的觀念,對文件系統(tǒng)來講是一個劃時代的作品。</p><p>  如果比較Btrfs的特性,將會發(fā)現(xiàn)Btrfs和ZFS非常類似。也許我們可以認(rèn)為Btrfs就是Linux社區(qū)對ZFS所作出的回應(yīng)。從此往后在Linux中也終于有了一個可以和ZFS相媲美的文件系統(tǒng)。</p><p>

48、;  Linux文件系統(tǒng)從誕生到現(xiàn)在,在不到半個世紀(jì)的時間里,已形成了堅實的理論基礎(chǔ)廣泛的應(yīng)用領(lǐng)域,吸引越來越多的研究者加入。EXT擴展文件系統(tǒng)是一個專門為 Linux 設(shè)計的文件系統(tǒng),從Ext1發(fā)展到Ext4。并在實踐應(yīng)用中充分證明了它是一個設(shè)計合理、性能穩(wěn)定、功能強大的文件系統(tǒng),值得我們不斷地去學(xué)習(xí)和研究應(yīng)用。</p><p>  1.1.3 EXT2文件系統(tǒng)的構(gòu)造</p><p>

49、  在ext2文件系統(tǒng)中,文件由inode(包含文件的所有信息)進行唯一標(biāo)識。一個文件可能對應(yīng)多個文件名,只有在所有文件名都被刪除后,該文件才會被刪除。此外,同一文件在磁盤中存放和被打開時所對應(yīng)的inode是不同的,并由內(nèi)核負(fù)責(zé)同步。</p><p>  ext2文件系統(tǒng)采用三級間接塊來存儲數(shù)據(jù)塊指針,并以塊(block,默認(rèn)為1KB)為單位分配空間[14]。其磁盤分配策略是盡可能將邏輯相鄰的文件分配到磁盤上物理

50、相鄰的塊中,并盡可能將碎片分配給盡量少的文件,以從全局上提高性能。ext2文件系統(tǒng)將同一目錄下的文件(包括目錄)盡可能的放在同一個塊組中,但目錄則分布在各個塊組中以實現(xiàn)負(fù)載均衡。在擴展文件時,會盡量一次性擴展8個連續(xù)塊給文件(以預(yù)留空間的形式實現(xiàn))。</p><p><b>  1.磁盤組織 </b></p><p>  在ext2系統(tǒng)中,所有元數(shù)據(jù)結(jié)構(gòu)的大小均基于”

51、塊”,而不是”扇區(qū)”。塊的大小隨文件系統(tǒng)的大小而有所不同。而一定數(shù)量的塊又組成一個塊組,每個塊組的起始部分有多種多樣的描述該塊組各種屬性的元數(shù)據(jù)結(jié)構(gòu)。ext2文件系統(tǒng)中對各個結(jié)構(gòu)的定義都包含在原始的include/linux/ext2_fs.h文件中。 </p><p><b>  (1)超級塊[8]</b></p><p>  每個ext2文件系統(tǒng)都必須包含一個超級

52、塊,其中存儲了該文件系統(tǒng)的大量基本信息,包括塊的大小、每塊組中包含的塊數(shù)等。同時,系統(tǒng)會對超級塊進行備份,備份被存放在塊組的第一個塊中。超級塊的起始位置為其所在分區(qū)的第1024個字節(jié),占用1KB的空間。 </p><p><b>  (2)塊組描述符 </b></p><p>  一個塊組描述符用來描述一個塊組的屬性。塊組描述符組由若干塊組描述符組成,描述了文件系統(tǒng)中

53、所有塊組的屬性,存放于終極塊所在塊的下一個塊中。 </p><p>  (3)塊位圖和inode位圖 </p><p>  塊位圖和inode位圖的每一位分別指出塊組中對應(yīng)的那個塊或inode是否被使用。 </p><p>  (4)inode表 </p><p>  inode表用于跟蹤定位每個文件,包括位置、大小等(但不包括文件名),一個

54、塊組只有一個inode表。 </p><p><b>  (5)數(shù)據(jù)塊 </b></p><p>  數(shù)據(jù)塊中存放文件的內(nèi)容,包括目錄表、擴展屬性、符號鏈接等。</p><p><b>  2.目錄結(jié)構(gòu) </b></p><p>  在ext2文件系統(tǒng)中,目錄是作為文件存儲的。根目錄總是在inode

55、表的第二項,而其子目錄則在根目錄文件的內(nèi)容中定義。</p><p><b>  3.文件擴展屬性 </b></p><p>  文件的屬性大多數(shù)是位于該文件的inode結(jié)構(gòu)中的標(biāo)準(zhǔn)屬性,也還包含其他一些擴展屬性(與系統(tǒng)中所有的inode相關(guān),通常用于增加額外的功能)。 </p><p>  inode的i_file_acl字段中保存擴展屬性的塊

56、的塊號。屬性頭部項位于屬性塊的起始位置,其后為屬性入口項,而屬性值能根據(jù)屬性入口項找到所在位置。</p><p>  1.2 課題研究的基本思想</p><p>  Linux系統(tǒng)的最大特點之一是對多種文件系統(tǒng)的支持,EXT2文件系統(tǒng)是Linux系統(tǒng)配置的標(biāo)準(zhǔn)文件系統(tǒng),其結(jié)構(gòu)與UNIX的文件系統(tǒng)類似。在Linux環(huán)境下編寫一個EXT2文件系統(tǒng)跟蹤程序,實現(xiàn)EXT2文件系統(tǒng)關(guān)鍵數(shù)據(jù)結(jié)構(gòu)的顯

57、示任務(wù):</p><p>  1.完成超級塊數(shù)據(jù)結(jié)構(gòu)每個字段信息的顯示;</p><p>  2.顯示每塊組數(shù)據(jù)結(jié)構(gòu)字段的信息;</p><p>  3.根據(jù)輸入的路徑顯示指定目錄下所有文件的目錄數(shù)據(jù)結(jié)構(gòu)字段信息;</p><p>  4.根據(jù)輸入的文件的I節(jié)點號顯示其I節(jié)點數(shù)據(jù)結(jié)構(gòu)字段信息。</p><p>  顯示

58、的主要信息包括:</p><p><b>  超級塊信息;</b></p><p><b>  塊組信息;</b></p><p>  塊位圖和I節(jié)點位圖的信息;</p><p><b>  目錄信息;</b></p><p><b>  I節(jié)

59、點信息;</b></p><p><b>  文件內(nèi)容。</b></p><p>  1.3 課題研究的目的與意義</p><p>  Linux文件系統(tǒng)從誕生到現(xiàn)在,在不到半個世紀(jì)的時間里,已形成了堅實的理論基礎(chǔ)廣泛的應(yīng)用領(lǐng)域,吸引越來越多的研究者加入。EXT擴展文件系統(tǒng)是一個專門為 Linux 設(shè)計的文件系統(tǒng),從Ext1發(fā)展到

60、Ext4。并在實踐應(yīng)用中充分證明了它是一個設(shè)計合理、性能穩(wěn)定、功能強大的文件系統(tǒng),值得我們不斷地去學(xué)習(xí)和研究應(yīng)用。</p><p>  通過編寫簡單的EXT2文件系統(tǒng)跟蹤程序,加深對Linux文件系統(tǒng)的認(rèn)識,進一步學(xué)習(xí)EXT2文件系統(tǒng)的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)構(gòu)成和操作,進而更加熟練的掌握并運用Linux操作系統(tǒng)。</p><p>  1.4 研究的方法與技術(shù)路線、研究難點,預(yù)期達(dá)到的目標(biāo)</

61、p><p>  1.研究的方法與技術(shù)路線:</p><p>  熟悉Linux操作系統(tǒng)下的C語言高級編程,了解Linux操作系統(tǒng)的shell執(zhí)行方式,熟練運用C語言對字符串進行處理。學(xué)習(xí)并掌握Linux C語言系統(tǒng)庫函數(shù)的用法,熟練運用某些庫函數(shù)來完成本文件跟蹤系統(tǒng)的設(shè)計。</p><p><b>  2.研究難點:</b></p>

62、<p>  Ext2文件系統(tǒng)結(jié)構(gòu)的掌握。</p><p><b>  3.預(yù)期目標(biāo):</b></p><p>  在Red Hat Linux操作系統(tǒng)下,設(shè)計并實現(xiàn)一個簡單的EXT2文件系統(tǒng)跟蹤程序,實現(xiàn)EXT2文件系統(tǒng)關(guān)鍵數(shù)據(jù)結(jié)構(gòu)的顯示任務(wù)等功能,能識別并提示錯誤的命令,同時具有一定的安全機制,并初步達(dá)到實用的水平。</p><p>

63、;  2 開發(fā)環(huán)境與開發(fā)工具 </p><p>  2.1 Red Hat 9.0簡介</p><p>  對于Red Hat來說,開放源代碼已經(jīng)不只是一個軟件模型,這正是Red Hat的商業(yè)模式。因為Red Hat堅信只有協(xié)作,企業(yè)才能創(chuàng)造出非凡質(zhì)量和價值的產(chǎn)品。 </p><p>  在Red Hat的300名工程師中,有6名來自于全世界最頂尖的10名Li

64、nux核心開發(fā)者,7名來自全球最出色10名Linux開發(fā)工具工程師。全世界,也許只有Red Hat能夠把Linux和開源技術(shù)以及企業(yè)級的培訓(xùn)、技術(shù)支持和咨詢?nèi)诤系萌绱嗣烂?。Red Hat的培訓(xùn)及認(rèn)證被認(rèn)為是Linux認(rèn)證的標(biāo)準(zhǔn)。Certification雜志的最新調(diào)查顯示,RHCE(Red Hat認(rèn)證工程師)認(rèn)證被公認(rèn)為總體質(zhì)量最高的國際IT認(rèn)證。</p><p>  Red Hat Linux 9.0繼承了Li

65、nux的高性能,融入了更多易操作的特點,又開發(fā)了很多新功能。Red Hat Linux 9.0整合了各開放源代碼社團的最新Linux技術(shù)成果和優(yōu)秀的Bluecurve界面,因而增加了更多的新功能和改善了桌面應(yīng)用。在安裝過程中,字體瀏覽、打印服務(wù)等都有了顯著的改進。另外,Red Hat Linux 9.0還采用了Linux 2.4.20內(nèi)核和Apache 2.0、最新版本的Mozilla瀏覽器、Ximian Evolution電子郵件客戶

66、端軟件、日歷和交流工具,以及OpenOffice.org提供的辦公套件等。對開發(fā)者而言,新版本的產(chǎn)品能提供更好的網(wǎng)絡(luò)打印功能和Posix Threading Library(NPTL)功能。</p><p><b>  2.2 Gcc</b></p><p>  2.2.1 Gcc概括</p><p>  GNU GCC是Linux等系統(tǒng)上

67、運行的功能強大的編譯器,是最重要的軟件開發(fā)工具,是自由軟件項目中極具代表性的項目。最初,GCC被認(rèn)為是GNU C Compiler的縮寫。GCC編譯后代的執(zhí)行效率比一般的編譯器效率要高20%-30%[5]。</p><p>  經(jīng)過10多年的發(fā)展,GCC不僅支持C語言,還支持Ada、C++、Java、Objective C、Pascal、COBOL等開發(fā)語言。目前,人們不再將GCC看成是一個純粹的C語言的編譯器。

68、GCC也變成GNU Compiler Collection(即GNU編譯器族)的縮寫。</p><p>  GCC能夠?qū)缀跛械挠布脚_提供支持,并有極好的編譯性能。GCC的編譯過程分為預(yù)處理、生成匯編代碼、生成目標(biāo)代碼和鏈接成可執(zhí)行文件等4個步驟。使用GCC編譯代碼時,可以通過參數(shù)控制其編譯過程,讓其停止在上訴4個步驟之一。</p><p>  由于Unix平臺的高度可移植性性,GCC

69、基本上在各種常見的Unix平臺上都能見到。尤其近些年來,伴隨著Linux系統(tǒng)的迅速推廣和流行,在其上運行的GCC也愈發(fā)受到人們的青睞,它的不斷完善和發(fā)展使許多商業(yè)編譯器都相形見絀。</p><p>  2.2.2 基本規(guī)則</p><p>  gcc所遵循的部分約定規(guī)則: </p><p>  .c為后綴的文件,C語言源代碼文件。 </p><

70、p>  .a為后綴的文件,是由目標(biāo)文件構(gòu)成的檔案庫文件。 </p><p>  .C,.cc或.cxx 為后綴的文件,是C++源代碼文件。 </p><p>  .h為后綴的文件,是程序所包含的頭文件。 </p><p>  .i 為后綴的文件,是已經(jīng)預(yù)處理過的C源代碼文件。 </p><p>  .ii為后綴的文件,是已經(jīng)預(yù)處理過的C

71、++源代碼文件。 </p><p>  .m為后綴的文件,是Objective-C源代碼文件。 </p><p>  .o為后綴的文件,是編譯后的目標(biāo)文件。 </p><p>  .s為后綴的文件,是匯編語言源代碼文件。 </p><p>  .S為后綴的文件,是經(jīng)過預(yù)編譯的匯編語言源代碼文件。</p><p>  2

72、.2.3 基本用法</p><p>  在使用Gcc編譯器的時候,我們必須給出一系列必要的調(diào)用參數(shù)和文件名稱。GCC編譯器的調(diào)用參數(shù)大約有100多個,這里只介紹其中最基本、最常用的參數(shù)。 </p><p>  GCC最基本的用法是∶gcc [options] [filenames] </p><p>  其中options就是編譯器所需要的參數(shù),filenames

73、給出相關(guān)的文件名稱。 </p><p>  -c,只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。 </p><p>  -o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預(yù)設(shè)的可執(zhí)行文件a.out。 <

74、/p><p>  -g,產(chǎn)生符號調(diào)試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調(diào)試,我們就必須加入這個選項。 </p><p>  -O,對程序進行優(yōu)化編譯、連接,采用這個選項,整個源代碼會在編譯、連接過程中進行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應(yīng)地要慢一些。 </p><p>  -O2,比-O更好的優(yōu)化編譯、連

75、接,當(dāng)然整個編譯、連接過程會更慢。 </p><p>  -Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過程中使用的參數(shù)。C程序中的頭文件包含兩種情況∶</p><p>  1.#include <myinc.h> 。</p><p>  2.#include “myinc.h”。 </p><

76、p>  其中,1類使用尖括號(< >),2類使用雙引號(“ ”)。對于1類,預(yù)處理程序cpp在系統(tǒng)預(yù)設(shè)包含文件目錄(如/usr/include)中搜尋相應(yīng)的文件,而2類,預(yù)處理程序在目標(biāo)文件的文件夾內(nèi)搜索相應(yīng)文件。</p><p><b>  2.3 Vi</b></p><p>  2.3.1 Vi編輯器的工作模式</p><

77、;p>  Vi是各種UNIX版本和類UNIX系統(tǒng)的標(biāo)準(zhǔn)編輯器,由于其功能強大、速度快,得到了Linux開發(fā)人員和管理人員的喜愛。Vi模式主要包括如下。</p><p><b>  1.命令模式:</b></p><p>  該模式下可以控制光標(biāo)的移動,進行字符刪除或行刪除操作,或是復(fù)制選定的某段數(shù)據(jù)到其他位置。輸入”i”或”a”可以進入插入模式或進入末行模式。&

78、lt;/p><p><b>  2.插入模式:</b></p><p>  進入該模式后可以進行文件的編輯和輸入操作。按”Ese”鍵退出插入模式進入命令模式。</p><p><b>  3.末行模式:</b></p><p>  在末行模式下可以進行存盤或退出Vi的操作。同時,該模式還支持查找和替代及

79、顯示行號的操作。在這一模式下輸入回車可回到命令模式。</p><p>  2.3.2 進入插入模式</p><p>  在命令模式下,輸入下面的命令將進入插入模式。</p><p>  (1)i: 在光標(biāo)之前插入 。</p><p>  (2)I: 在光標(biāo)所在行的行首插入。</p><p>  (3)a: 在光標(biāo)之后

80、插入 。</p><p>  (4)A: 在光標(biāo)所在行的行末插入。 </p><p>  (5)o: 在光標(biāo)所在的行的下面插入一行。 </p><p>  (6)O: 在光標(biāo)所在的行的上面插入一行 。</p><p>  (7)r: 用輸入的文本替換光標(biāo)所在字符。 </p><p>  (8)R: 用輸入的文本替換光標(biāo)

81、所在行。</p><p>  2.3.3 末行模式下的常用命令</p><p>  在命令模式下輸入”:”將進入末行模式,末行模式支持如下的命令。</p><p>  (1) w 保存。 </p><p>  (2)e文件名:打開該文件進行編輯 </p><p>  (3):x 保存當(dāng)前文件并退出。 </p&g

82、t;<p>  (4):q 退出Vi。 </p><p>  (5):q! 不保存修改,強制退出。</p><p>  3 系統(tǒng)設(shè)計與實現(xiàn)</p><p>  3.1 系統(tǒng)設(shè)計思想</p><p>  超級塊主要用來描述目錄和文件在磁盤上的靜態(tài)分布,包括大小和結(jié)構(gòu)。比如給定塊大小,inode總數(shù),每組內(nèi)inode節(jié)點數(shù),空閑

83、塊和inode數(shù)等。超級塊存放在include/Linux/ext2_fs.h中的Struct ext2_super_block結(jié)構(gòu)內(nèi)。在Linux操作系統(tǒng)啟動時,根設(shè)備中的超級塊被讀入內(nèi)存中,在某個組的超級塊或者inode受損時,可以用來恢復(fù)系統(tǒng)。超級塊對于文件系統(tǒng)的維護至關(guān)重要。</p><p>  程序ext2fs_std將實現(xiàn)EXT2文件系統(tǒng)關(guān)鍵數(shù)據(jù)結(jié)構(gòu)的顯示任務(wù)。包括超級塊信息、塊位圖和索引節(jié)點位圖的信

84、息、目錄信息、索引節(jié)點信息以及顯示文件內(nèi)容。程序ext2_std緊跟的參數(shù)<device name>表示可以用設(shè)備名,由于本程序不支持除了EXT2之外的其他文件系統(tǒng),如果設(shè)備不是EXT2文件系統(tǒng)則會報錯退出,然后通過程序提供的菜單選擇用戶所想了解的EXT2文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)中的信息,并且可以以只讀方式訪問普通文件以外以文本或者十六進制碼顯示。</p><p><b>  3.2 系統(tǒng)實現(xiàn)&

85、lt;/b></p><p>  3.2.1 main()函數(shù)</p><p>  此函數(shù)的主要功能是在確認(rèn)設(shè)備及文件系統(tǒng)正確后,打開并初始化超級塊,然后顯示菜單??梢愿鶕?jù)自己的需要來選擇使用其中的功能,流程圖如圖3-2所示,以下是部分代碼:</p><p><b>  main()</b></p><p>&l

86、t;b>  {</b></p><p><b>  char c;</b></p><p>  int i = 0;</p><p><b>  menu;</b></p><p><b>  do</b></p><p><b&

87、gt;  {</b></p><p>  scanf(“ %c”&c);</p><p>  if(s == 'h') print();</p><p>  else if(c == 's') super();</p><p>  else if(c ==

88、'g') show_group();</p><p>  else if(c == 'd') ch_directory();</p><p>  else if(c == 'i') inode();</p><p>  else if(c == 'q')

89、i = 1;</p><p>  }while(i == 0);</p><p>  printf(“You have to exit the system\n”);</p><p><b>  }</b></p><p>  void menu()</p><p><b>  {<

90、;/b></p><p>  printf(“\n\n”);</p><p>  printf(“______________________________________________________\n”); </p><p>  printf(“| command | Action

91、 |\n”);</p><p>  printf(“------------------------------------------------------\n”);</p><p>  printf(“| | |\n”);</p>

92、<p>  printf(“| s | show super block |\n”);</p><p>  printf(“| g | show group descriptor |\n”);</p><p>  printf(“| d | show

93、 internal structure of directory |\n”);</p><p>  printf(“| i | show inode information |\n”);</p><p>  printf(“| h | print this menu |\n”);&

94、lt;/p><p>  printf(“| q | quit |\n”);</p><p>  printf(“| | |\n”);</p><p>  printf(“----------

95、--------------------------------------------\n”);</p><p>  printf(“\t\t\n”);</p><p>  printf(“command h for help: “); </p><p><b>  }</b></p>

96、<p>  圖3-2 main()函數(shù)程序流程圖</p><p>  3.2.2 super()函數(shù)</p><p>  EXT 2 超塊中包含了描敘文件系統(tǒng)基本尺寸和形態(tài)的信息, 是定義在include/Linux/ ext2- fs. h 中ex t2- super- block 數(shù)據(jù)結(jié)構(gòu)描述的。文件系統(tǒng)管理器利用它們來使用和維護文件系統(tǒng)。通常安裝文件系統(tǒng)時只讀取數(shù)據(jù)塊組

97、0 中的超塊, 但是為了防止文件系統(tǒng)被破壞, 每個數(shù)據(jù)塊組都包含了它的拷貝。 超塊中的主要信息如下:</p><p>  Mag ic Number : 文件系統(tǒng)安裝軟件用來檢驗是否是一個真正的EXT2 文件系統(tǒng)超塊。當(dāng)前EXT 2 版本中為0xEF53。</p><p>  Block Size : 以字節(jié)記數(shù)的文件系統(tǒng)塊大小。</p><p>  Blocks

98、per Group : 每個組中塊數(shù)目。當(dāng)文件系統(tǒng)創(chuàng)建時此塊大小被固定下來。</p><p>  Free Blocks : 文件系統(tǒng)中的空閑塊數(shù)。</p><p>  Free Inodes : 文件系統(tǒng)中空閑Inode 數(shù)。</p><p>  First Inode : 文件系統(tǒng)中第一個Inode 號。EXT2 根文件系統(tǒng)中第一個Inode 將是指向‘/’ 目

99、錄的入口。</p><p>  此函數(shù)的主要功能是顯示超級塊的數(shù)據(jù)結(jié)構(gòu)中每條字段的信息,程序流程圖如圖3-3所示。</p><p>  圖3-3 super()函數(shù)程序流程圖 </p><p>  3.2.3 show_group()函數(shù)</p><p>  此函數(shù)的主要功能是顯示每塊組的數(shù)據(jù)結(jié)構(gòu)各字段的信息,并且可以根據(jù)需要查看塊位圖和索

100、引節(jié)點位圖的信息,主要信息包括有:</p><p>  Blocks Bitmap : 對應(yīng)此數(shù)據(jù)塊組的塊分配位圖的塊號, 在塊分配和回收時使用。</p><p>  Inode Bitmap : 對應(yīng)此數(shù)據(jù)塊組的Inode 分配位圖的塊號, 在Inode 分配和回收時使用。</p><p>  Inode Table : 對應(yīng)數(shù)據(jù)塊組的Inode 表的起始塊號。每

101、個Inode 用下面的EXT2 Inode 結(jié)構(gòu)來表示。Free blocks count, Free Inodes count , Used directory count。</p><p>  程序流程圖如圖3-4和圖3-5所示, 下面為部分代碼:</p><p>  //顯示第一塊組的信息 </p><p>  for(i=o;i<group_block

102、s;i++)</p><p><b>  { </b></p><p>  printf(“\n\nGroup %d of %d”,i,group_block-1);</p><p><b>  count=i;</b></p><p><b>  group(i);</b>&

103、lt;/p><p><b>  i=count;</b></p><p>  //詢問是否查看下一塊組信息</p><p>  if(i<(group_blocks-1))</p><p><b>  {</b></p><p><b>  while(1)<

104、;/b></p><p><b>  {</b></p><p>  printf(“\n\nDo you want to view the next block?(y/n)”);</p><p>  scanf(“%s”,&tmp);</p><p>  str=(char *)malloc(strlen

105、(tmp));</p><p>  strcpy(str,tmp);</p><p>  if((strcmp(str,”n”)==0||(strcmp(str,”N”)==0)||(strcmp(str,”Y”)==0)||strcmp(str,”y”)==0))</p><p><b>  break;</b></p><

106、;p>  //不查看下一塊組信息,退出</p><p>  if((strcmp(str,rep1)==0)||(strcmp(str,rep2)==0))</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }<

107、;/b></p><p><b>  }</b></p><p>  圖3-4 group()函數(shù)程序流程圖</p><p>  圖3-5 show_group()函數(shù)程序流程圖</p><p>  3.2.4 directory()函數(shù)</p><p>  在EXT 2 文件系統(tǒng)中目錄是

108、包含文件存取路徑的特殊文件。目錄文件是一組目錄入口的鏈表, 它們包含以下信息:</p><p>  Inode : 對應(yīng)每個目錄入口的Inode, 被用來索引儲存在數(shù)據(jù)塊組的Inode 表中的Inode 數(shù)組。</p><p>  name length : 以字節(jié)記數(shù)的目錄入口長度。</p><p>  name : 目錄入口的名稱。</p><

109、;p>  此函數(shù)的主要功能是根據(jù)輸入的路徑顯示其目錄下所有文件的內(nèi)核目錄數(shù)據(jù)結(jié)構(gòu)字段信息,查找EXT2文件的一般步驟流程如下。</p><p>  1.首先讀取超級塊信息,了解磁盤分區(qū)的管理信息,特別是塊長度和inode表起始塊號。</p><p>  2.找到根”/”目錄信息。EXT2文件系統(tǒng)中,根目錄的索引節(jié)點號事固定的,即EXT2_ROOT_INO=2,讀取2號索引節(jié)點表信息,

110、即可找到根目錄所在的塊號。在/include/Linux/ext2_fs.h中定義EXT2_ROOT_INO:</p><p>  #define EXT2_ROOT_INO 2 /* Root inode */</p><p>  3.讀取根目錄或普通目錄所在塊的信息,根據(jù)ext2_dir_entry_2結(jié)構(gòu),找到子目錄或文件的inode號。</p><

111、;p>  4.讀取子目錄或文件的inode信息,找到文件數(shù)據(jù)所在的磁盤塊號。</p><p>  讀取子目錄或文件數(shù)據(jù)塊的信息。如果是文件,則查找結(jié)束。如果是目錄,轉(zhuǎn)到(3)。EXT2文件數(shù)據(jù)塊地址存放在指針數(shù)組i_block[15]中。指針數(shù)組i_block[0]-i_block[11]中直接包含文件塊0~11的物理塊地址,而i_block[13]中包含一次間接尋址地址,i_block[14]中包含二次間

112、接尋址地址,i_block[15]中包含三次間接尋址地址。</p><p><b>  部分代碼如下:</b></p><p><b>  //路徑文件名分析</b></p><p>  while(search(ptr,ch)!=-1)</p><p><b>  {</b>

113、</p><p><b>  if(i1==0)</b></p><p><b>  {</b></p><p><b>  ptr++;</b></p><p><b>  continue;</b></p><p><b&

114、gt;  }</b></p><p>  else if(i1>0)</p><p><b>  {</b></p><p>  dir_name=(char *)malloc(i1+1);</p><p><b>  n1=0;</b></p><p> 

115、 while(n1,i1)</p><p><b>  {</b></p><p>  dir_name[n1]=*ptr;</p><p><b>  ptr++;</b></p><p><b>  n1++;</b></p><p><b&g

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論