




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、簡(jiǎn)單多用戶(hù)文件系統(tǒng)簡(jiǎn)單多用戶(hù)文件系統(tǒng)目錄目錄一、課程設(shè)計(jì)任務(wù)描述一、課程設(shè)計(jì)任務(wù)描述 .2二、設(shè)計(jì)思想說(shuō)明二、設(shè)計(jì)思想說(shuō)明 .22.1 對(duì)該任務(wù)的理解分析.22.2 設(shè)計(jì)任務(wù)剖析.32.3 程序設(shè)計(jì)環(huán)境及工具選擇.42.4 函數(shù)層次圖(即模塊關(guān)系圖).5三、三、EXT2 文件系統(tǒng)簡(jiǎn)介文件系統(tǒng)簡(jiǎn)介.53.1 文件系統(tǒng)概述.53.2 EXT2 文件系統(tǒng)簡(jiǎn)介.5四、數(shù)據(jù)設(shè)計(jì)與表示四、數(shù)據(jù)設(shè)計(jì)與表示 .74.1 頭文件說(shuō)明.74.1.1 頭文件:types.h.74.1.2 頭文件:filetype.h.74.1.3 頭文件:sys.h.84.2 數(shù)據(jù)結(jié)構(gòu)說(shuō)明.84.2.1 超級(jí)塊(super blo
2、ck).84.2.2 組描述符.84.2.3 磁盤(pán)索引節(jié)點(diǎn).94.2.4 內(nèi)存索引節(jié)點(diǎn).104.2.5 磁盤(pán)目錄項(xiàng)結(jié)構(gòu)體.104.2.6 當(dāng)前目錄結(jié)構(gòu)體.114.2.7 用戶(hù)打開(kāi)文件表結(jié)構(gòu)體.114.2.8 系統(tǒng)打開(kāi)文件表結(jié)構(gòu)體.114.2.9 用戶(hù)結(jié)構(gòu)體.124.3 宏定義說(shuō)明.124.4 主要函數(shù)列表.134.5 算法流程圖.14五、數(shù)據(jù)分析五、數(shù)據(jù)分析 .175.1 輸入數(shù)據(jù).175.2 輸出數(shù)據(jù)分析.17六、使用說(shuō)明六、使用說(shuō)明 .186.1 歡迎界面.186.2 用戶(hù)登陸界面.186.3 系統(tǒng)使用界面.196.4 創(chuàng)建目錄及顯示目錄界面.19七、課程設(shè)計(jì)總結(jié)七、課程設(shè)計(jì)總結(jié) .207
3、.1 與給定文件系統(tǒng)的對(duì)比分析.207.2 未完成部分及改進(jìn)方法.207.2 課程設(shè)計(jì)總結(jié).20八、參考文獻(xiàn)八、參考文獻(xiàn) .20九、程序源代碼及注解九、程序源代碼及注解 .21一、課程設(shè)計(jì)任務(wù)描述一、課程設(shè)計(jì)任務(wù)描述為 LINUX 設(shè)計(jì)一個(gè)簡(jiǎn)單的二級(jí)文件系統(tǒng)。要求做到以下幾點(diǎn):1、 可以實(shí)現(xiàn)下列幾條命令Login 用戶(hù)登錄Dir列文件目錄Create創(chuàng)建文件Delete刪除文件Open打開(kāi)文件Close關(guān)閉文件Read讀文件Write 寫(xiě)文件2、列目錄時(shí)要列出文件名、物理地址、保護(hù)碼和文件長(zhǎng)度。3、源文件可以進(jìn)行讀寫(xiě)保護(hù)。二、二、設(shè)計(jì)思想說(shuō)明設(shè)計(jì)思想說(shuō)明2.1 對(duì)該任務(wù)的理解分析一個(gè)文件系統(tǒng)從
4、功能上劃分程序?yàn)樗膫€(gè)部分,第一部分是有關(guān)高速緩沖區(qū)的管理程序,主要實(shí)現(xiàn)了對(duì)硬盤(pán)等塊設(shè)備進(jìn)行數(shù)據(jù)高速存取的函數(shù);第二部分代碼描述了文件系統(tǒng)的底層通用函數(shù),說(shuō)明了文件索引節(jié)點(diǎn)的管理、磁盤(pán)數(shù)據(jù)塊的分配和釋放以及文件名與 i 節(jié)點(diǎn)的轉(zhuǎn)換算法;第三部分程序是有關(guān)對(duì)文件中數(shù)據(jù)進(jìn)行讀寫(xiě)操作,包括對(duì)字符設(shè)備、管道、塊讀寫(xiě)文件中數(shù)據(jù)的訪問(wèn);第四部分的程序與文件的系統(tǒng)調(diào)用接口的實(shí)現(xiàn)有關(guān),主要涉及文件打開(kāi)、關(guān)閉、創(chuàng)建以及有關(guān)文件目錄操作等的系統(tǒng)調(diào)用。由于我們不能親自設(shè)計(jì)驅(qū)動(dòng)程序,所以我們要模擬文件系統(tǒng)的設(shè)計(jì)、實(shí)現(xiàn)和功能,就不能把它直接做為操作系統(tǒng)實(shí)際的文件系統(tǒng)進(jìn)行掛接。鑒于此,我們就有兩個(gè)思路來(lái)完成該任務(wù),一是在實(shí)
5、際的硬盤(pán)上創(chuàng)建一個(gè)文件,把它做為磁盤(pán)進(jìn)行各種對(duì)磁盤(pán)的模擬操作,這樣做的好處是可以對(duì)它進(jìn)行連續(xù)操作,只要在退出文件系統(tǒng)時(shí),及時(shí)保存它的狀態(tài),當(dāng)我們下次啟動(dòng)程序時(shí),就能繼續(xù)以前的操作,相比而言這更接近于實(shí)際;二是在內(nèi)存中開(kāi)辟一塊空間,譬如 1M 或 2M 大小,繼而對(duì)這塊內(nèi)存區(qū)域模擬磁盤(pán)操作,操作靈活但這樣需每次開(kāi)辟空間,極有可能隱藏一些需要關(guān)閉文件系統(tǒng)才能發(fā)現(xiàn)的錯(cuò)誤,也就是說(shuō)這樣做不易于排錯(cuò)。在本次的課程設(shè)計(jì)中,我們決定采用第一種方案。由于是在文件級(jí)上的操作,所以我們不必去寫(xiě)設(shè)備驅(qū)動(dòng)程序,只需要開(kāi)辟文件調(diào)用fwrite、fread、fseek、ftell、fput、fget 等庫(kù)函數(shù)進(jìn)行讀寫(xiě)即可
6、。在文件系統(tǒng)四部分程序中,我們只需要編寫(xiě)第二部分文件系統(tǒng)的底層通用函數(shù)即可。2.2 設(shè)計(jì)任務(wù)剖析在本次的課程設(shè)計(jì)中,我們沒(méi)有沿用課程設(shè)計(jì)指導(dǎo)書(shū)上文件系統(tǒng)的例子程序,而是決定模擬 Linux 的標(biāo)準(zhǔn)根文件系統(tǒng) EXT2,其原因我們會(huì)在課程設(shè)計(jì)總結(jié)中給出。我們認(rèn)為 EXT2 主要的設(shè)計(jì)思想是磁盤(pán)分區(qū)再分組,數(shù)據(jù)存儲(chǔ)使用混合索引方式。這也是我們要實(shí)現(xiàn)的主要功能。在參考了 Linux0.11 文件系統(tǒng) Minix2.0 及 Linux2.4EXT2 的底層通用函數(shù)后,本著設(shè)計(jì)簡(jiǎn)單可表達(dá) EXT2 設(shè)計(jì)思想的原則,我們需要編寫(xiě)的程序要實(shí)現(xiàn)下列功能:格式化程序。在硬盤(pán)上創(chuàng)建一個(gè)文件,用來(lái)模擬磁盤(pán);對(duì)磁盤(pán)按
7、照 EXT2 文件系統(tǒng)結(jié)構(gòu)進(jìn)行劃分;主要數(shù)據(jù)的寫(xiě)入,包括根目錄、登陸文檔、超級(jí)塊、組描述符的初始化及組描述符表、塊位圖索引節(jié)點(diǎn)位圖的初始化及索引節(jié)點(diǎn)表。磁盤(pán)讀寫(xiě)函數(shù)。這部分的函數(shù)要完成的功能包括:讀寫(xiě)指定的磁盤(pán)塊;讀寫(xiě)指定的索引節(jié)點(diǎn)表和塊位圖;讀寫(xiě)指定的超級(jí)塊和組描述符。數(shù)據(jù)塊分配和回收函數(shù)。按照先組從小到大,后邏輯塊編號(hào)從小到大的順序分配數(shù)據(jù)塊;回收指定的邏輯塊改寫(xiě)相應(yīng)組內(nèi)的塊位圖。索引節(jié)點(diǎn)分配和回收。按照先組從小到大,后索引編號(hào)從小到大的順序分配索引節(jié)點(diǎn);回收指定的索引節(jié)點(diǎn)改寫(xiě)相應(yīng)組內(nèi)的索引節(jié)點(diǎn)位圖。目錄操作函數(shù)。列表顯示當(dāng)前目錄內(nèi)目錄項(xiàng),更改目錄及刪除目錄。文件操作函數(shù)。組織進(jìn)程和文件系
8、統(tǒng)的關(guān)系,包括用戶(hù)打開(kāi)文件表和系統(tǒng)打開(kāi)文件表的初始化和管理。創(chuàng)建文件、刪除文件、打開(kāi)文件、關(guān)閉文件、讀文件和寫(xiě)文件。程序是引用文件描述符來(lái)操作文件的。用戶(hù)認(rèn)證。讀取文件系統(tǒng)的密碼文檔,對(duì)登陸用戶(hù)驗(yàn)證。由于 EXT2 文件系統(tǒng)是相對(duì)較大的程序的組合,在較短的時(shí)間內(nèi)很難全面模仿,所以我們對(duì)它在不改變其主要設(shè)計(jì)思想的基礎(chǔ)上,進(jìn)行了適當(dāng)簡(jiǎn)化。編寫(xiě)程序時(shí)主要遵循的設(shè)計(jì)思想如下:設(shè)置全局宏定義。在實(shí)際中,文件系統(tǒng)要引用一些常量,是在各種數(shù)據(jù)結(jié)構(gòu)體中查找的,而我們?yōu)榱耸沟贸绦蛟O(shè)計(jì)的簡(jiǎn)單,使用了全局的宏定義,在程序的任何地方都可方便的使用。數(shù)據(jù)分配采用混合索引方式。在數(shù)據(jù)塊的組織上我們使用 EXT2 的混合索
9、引方式,但我們不準(zhǔn)備照搬 EXT2 的方式,而是把數(shù)據(jù)指針定為 5 個(gè),前 4 個(gè)作為直接指針,第 5 個(gè)做為單級(jí)指針。這樣我們文件系統(tǒng)中文件最大就定為了:(BLOCKSIZE_BT是以字節(jié)表示的磁盤(pán)塊大小)4*BLOCKSIZE_BT+(BLOCKSIZE_BT/4)*BLOCKSIZE_BT=4*512B+(512/4)*512B=67584B=67584B/(1024B/K)=66KB目錄采用直接指針?lè)绞健T趧?chuàng)建目錄項(xiàng)時(shí),我們把這 5 個(gè)數(shù)據(jù)指針都作為了直接指針。那么每個(gè)目錄可包含的目錄項(xiàng)為:5*(BLOCKSIZE_BT/DIR_ENTRY_LEN)=40在進(jìn)程和文件系統(tǒng)的關(guān)系上,使用
10、了 EXT2 的組織方式,可用下圖表示:2.3 程序設(shè)計(jì)環(huán)境及工具選擇該試驗(yàn)程序是小組成員在 Windows2000 平臺(tái)下,使用 Microsoft Visual C+ 6.0 編輯、編譯及調(diào)試通過(guò)的。之所以選擇這種組合是在考慮了 Windows 平臺(tái)的易用性、廣泛性和程序文件轉(zhuǎn)儲(chǔ)簡(jiǎn)單等特性,另外 Visual C+可自己組織程序的調(diào)用和編譯,省去了在 Linux平臺(tái)下使用 GNU/GCC 書(shū)寫(xiě) Makefile 文件系統(tǒng)的麻煩。這樣可以在較短的時(shí)間內(nèi)完成文件系統(tǒng)復(fù)雜程序的編寫(xiě)??紤]到 Visual C+是 32 位的編譯器,為了在其他一些 16 位編譯器如TC 下編譯通過(guò),我們特意為此設(shè)計(jì)
11、了通用模式。關(guān)于此下文有詳細(xì)的說(shuō)明。2.4 函數(shù)層次圖(即模塊關(guān)系圖)圖例說(shuō)明: 為 shell 調(diào)用命令為程序調(diào)用函數(shù)三、三、EXT2 文件系統(tǒng)簡(jiǎn)介文件系統(tǒng)簡(jiǎn)介3.1 文件系統(tǒng)概述簡(jiǎn)單地說(shuō),文件系統(tǒng)就是操作系統(tǒng)與存儲(chǔ)介質(zhì)之間交換數(shù)據(jù)的一種協(xié)議約定,它對(duì)文件的組織和存取規(guī)則進(jìn)行詳細(xì)描述,同時(shí)保證數(shù)據(jù)的完整性。有了這種邏輯上的約定,文件系統(tǒng)就不必了解數(shù)據(jù)塊的物理存儲(chǔ)位置,它只需保存邏輯塊的編號(hào),而對(duì)磁盤(pán)的物理操作是由文件系統(tǒng)磁盤(pán)函數(shù)庫(kù)(Disk Library)中的各種底層函數(shù),通過(guò)塊設(shè)備驅(qū)動(dòng)程序,來(lái)完成由邏輯塊編號(hào)到物理存儲(chǔ)位置的轉(zhuǎn)換。3.2 EXT2 文件系統(tǒng)簡(jiǎn)介L(zhǎng)inux 第一版的文件系統(tǒng)
12、來(lái)自 Minix,隨著 Linux 的逐步成熟,從而為 Linux 量身定做了 EXT 文件系統(tǒng),但其性能差強(qiáng)人意,并不能滿(mǎn)足實(shí)際的需要。1993 年由 Remy Card 做了進(jìn)一步改良,EXT 演變?yōu)?EXT2,它同樣是建立在文件的數(shù)據(jù)以數(shù)據(jù)塊為組織單位的前提下。因其高效和強(qiáng)健的特性,成為了 Linux 內(nèi)核使用的標(biāo)準(zhǔn)根文件系統(tǒng)。EXT2 的英文全稱(chēng)是Second Extrended File System,亦即第二擴(kuò)展文件系統(tǒng)的意思,它負(fù)責(zé)管理系統(tǒng)外存上的文件,為操作系統(tǒng)和用戶(hù)提供對(duì)文件的存取、共享和保護(hù)的手段。Ext2 的優(yōu)點(diǎn)是:支持達(dá) 4 TB 的內(nèi)存。 文件名稱(chēng)最長(zhǎng)可以到 1012
13、 個(gè)字符。 當(dāng)創(chuàng)建文件系統(tǒng)時(shí),管理員可以選擇邏輯塊的大?。ㄍǔ4笮】蛇x擇 1024、2048 和 4096 字節(jié)) 。 實(shí)現(xiàn)快速符號(hào)鏈接:不需要為此目的而分配數(shù)據(jù)塊,并且將目標(biāo)名稱(chēng)直接存儲(chǔ)在索引節(jié)點(diǎn)(inode)表中。這使性能有所提高,特別是在速度上。因?yàn)?Ext2 文件系統(tǒng)的穩(wěn)定性、可靠性和健壯性,所以幾乎在所有基于 Linux 的系統(tǒng)(包括臺(tái)式機(jī)、服務(wù)器和工作站 并且甚至一些嵌入式設(shè)備)上都使用 Ext2 文件系統(tǒng)。然而,當(dāng)在嵌入式設(shè)備中使用 Ext2fs 時(shí),它有一些缺點(diǎn):Ext2 是為象 IDE 設(shè)備那樣的塊設(shè)備設(shè)計(jì)的,這些設(shè)備的邏輯塊大小是 512 字節(jié),1 K 字節(jié)等這樣的倍數(shù)。這
14、不太適合于扇區(qū)大小因設(shè)備不同而不同的閃存設(shè)備。Ext2 文件系統(tǒng)沒(méi)有提供對(duì)基于扇區(qū)的擦除寫(xiě)操作的良好管理。在 Ext2 中,為了在一個(gè)扇區(qū)中擦除單個(gè)字節(jié),必須將整個(gè)扇區(qū)復(fù)制到 RAM,然后擦除,然后重寫(xiě)入??紤]到閃存設(shè)備具有有限的擦除壽命(大約能進(jìn)行 100,000 次擦除) ,在此之后就不能使用它們,所以這不是一個(gè)特別好的方法。在出現(xiàn)電源故障時(shí),Ext2fs 不是防崩潰的。Ext2 文件系統(tǒng)不支持損耗平衡,因此縮短了扇區(qū)閃存的壽命。 (損耗平衡確保將地址范圍的不同區(qū)域輪流用于寫(xiě)和或擦除操作以延長(zhǎng)閃存設(shè)備的壽命。 )Ext2fs 沒(méi)有特別完美的扇區(qū)管理,這使設(shè)計(jì)塊驅(qū)動(dòng)程序十分困難。EXT2 把
15、硬盤(pán)分成多個(gè)分區(qū),通常必須有一個(gè)主分區(qū)(Native)和一個(gè)交換分區(qū)(Swap),Linux 把每一個(gè)分區(qū)都當(dāng)作一個(gè)獨(dú)立的設(shè)備對(duì)待。主分區(qū)的大部分空間用來(lái)存儲(chǔ)系統(tǒng)中的各種數(shù)據(jù),例如普通文件、目錄文件等文件,少部分用來(lái)定義文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu);交換分區(qū)用作系統(tǒng)的虛擬內(nèi)存。實(shí)際上每個(gè)分區(qū)都是一個(gè)文件系統(tǒng),有它們各自的頂層目錄和下面的目錄層次結(jié)構(gòu)。這些單獨(dú)的文件系統(tǒng)按照一定的掛接方式形成一個(gè)總的目錄層次結(jié)構(gòu)。邏輯分區(qū)繼續(xù)分成多個(gè)塊組(block group) ,塊組下面又分為超級(jí)塊(SuperBlock)、組描述符表(group descriptors)、塊位圖(Bitmap) 、索引節(jié)點(diǎn)(inode
16、)位圖、索引節(jié)點(diǎn)表、目錄塊和數(shù)據(jù)塊等,它們各自占有不同數(shù)量的邏輯塊,在文件系統(tǒng)中起著不同的作用。在塊組 0 之前還有一個(gè)引導(dǎo)塊,它位于任何 EXT2 分區(qū)中的第 1 塊,是為分區(qū)的啟動(dòng)扇區(qū)保留的,不受 Ext2 文件系統(tǒng)的管理。若該分區(qū)為系統(tǒng)的主引導(dǎo)分區(qū)時(shí),引導(dǎo)塊的內(nèi)容就為引導(dǎo)信息含有可執(zhí)行代碼,否則為空。在同一個(gè)文件系統(tǒng)中,數(shù)據(jù)塊的大小是固定的,對(duì)于不同的 EXT2 文件系統(tǒng)這個(gè)值可以不同。數(shù)據(jù)塊的大小是在建立 EXT2 文件系統(tǒng)時(shí),由系統(tǒng)管理員指定或由文件系統(tǒng)的創(chuàng)建程序根據(jù)硬盤(pán)分區(qū)的大小,自動(dòng)選擇一個(gè)較合理的值確定的,這個(gè)值一經(jīng)確定,文件系統(tǒng)就把它作為基本參數(shù)保存起來(lái),在運(yùn)行期間就不會(huì)改動(dòng)
17、了。以后文件所需的存儲(chǔ)空間就依照這個(gè)指定大小的數(shù)據(jù)塊為基本單位進(jìn)行分配。在每個(gè)塊組中重復(fù)保存著相對(duì)于其分區(qū)文件系統(tǒng)的一些重要信息,包括一份超級(jí)塊的拷貝和一組塊組描述符的拷貝。這種對(duì)文件系統(tǒng)完整性關(guān)鍵信息的重復(fù)保存,雖然浪費(fèi)了一些存儲(chǔ)空間,但有助于文件系統(tǒng)在發(fā)生故障時(shí)的還原。實(shí)際上只有塊組 0 中所包含的超級(jí)塊和組描述符才被內(nèi)核讀取使用,其余的拷貝信息一般保持不變,只有當(dāng)出現(xiàn)數(shù)據(jù)損壞,并且塊組 0 中的主超級(jí)塊和主描述符表變?yōu)镋XT2 文件系統(tǒng)的邏輯硬盤(pán)布局無(wú)效時(shí),才被文件系統(tǒng)引用,通過(guò) e2fsck 程序把 Ext2 分區(qū)恢復(fù)到某個(gè)一致的狀態(tài)。四、數(shù)據(jù)設(shè)計(jì)與表示四、數(shù)據(jù)設(shè)計(jì)與表示4.1 頭文件
18、說(shuō)明4.1.1 頭文件:types.h#ifndef _I386_TYPES_H#define _I386_TYPES_H#define VARTYPE 1 /1 為在 vc 下編譯#if VARTYPE=1typedef unsigned int _U32; typedef unsigned short _U16;typedef unsigned char _U8;typedef int _S32; typedef short _S16;typedef char _S8;#elsetypedef unsigned long _U32;typedef unsigned int _U16;typ
19、edef unsigned char _U8;typedef long _S32;typedef int _S16;typedef char _S8;#endif#endif因?yàn)樵?16 位和 32 位的編譯器下表達(dá) int 的字節(jié)是不同的,而在寫(xiě)各種數(shù)據(jù)塊時(shí)又必須按照字節(jié)對(duì)應(yīng)寫(xiě)入,這就照成了程序的不能通用。鑒于此,我們使用 typedef 命令把數(shù)據(jù)類(lèi)型進(jìn)行了規(guī)定。4.1.2 頭文件:filetype.h#ifndef _FILETYPE_#define _FILETYPE_#define UKN0 x0000 /0 未知#define REG0 x0001 /1 普通文件#define D
20、IR0 x0002 /2 目錄文件#define CHR0 x0003 /3 字符設(shè)備#define BLK0 x0004 /4 塊設(shè)備#define FIFO 0 x0005 /5 命名管道#define SOCK 0 x0006 /6 套接字#define LNK0 x0007 /7 符號(hào)鏈接#defineS_IREG(flag) (flag=0 x01)?REG:0/1 判斷普通文件#defineS_IDIR(flag) (flag=0 x02)?DIR:0/2 判斷目錄文件#defineS_ICHR(flag) (flag=0 x03)?CHR:0/3 判斷字符設(shè)備#defineS_I
21、BLK(flag) (flag=0 x04)?BLK:0/4 判斷塊設(shè)備#defineS_IFIFO(flag) (flag=0 x05)?FIFO:0/5 判斷命名管道#defineS_ISOCK(flag)(flag=0 x06)?SOCK:0 /6 判斷套接字#defineS_ILNK(flag) (flag=0 x07)?LNK:0/7 判斷符號(hào)鏈接#endif按照 UNIX 的文件屬性設(shè)置定義該頭文件,及用來(lái)對(duì)文件屬性的判斷。4.1.3 頭文件:sys.h該頭文件包括了系統(tǒng)使用的各種宏定義和數(shù)據(jù)結(jié)構(gòu),這部分的內(nèi)容將在“數(shù)據(jù)結(jié)構(gòu)說(shuō)明”和“宏定義說(shuō)明”部分予以介紹。4.2 數(shù)據(jù)結(jié)構(gòu)說(shuō)明4
22、.2.1 超級(jí)塊(super block)超級(jí)塊位于每個(gè)塊組的最前面,如前所述對(duì)于每個(gè)塊組其內(nèi)容是相同的,在任何一個(gè)塊組中超級(jí)塊只占用 1 個(gè)數(shù)據(jù)塊。它是用來(lái)描述 EXT2 文件系統(tǒng)整體布局信息的數(shù)據(jù)結(jié)構(gòu),包含其所在分區(qū)文件系統(tǒng)目錄和文件的靜態(tài)分布情況,并給出文件系統(tǒng)各組成部分的大小和形狀等信息。struct ext2_super_block _U32s_inodes_count; /* 索引節(jié)點(diǎn)的總數(shù) Inodes count */_U32s_blocks_count; /* 以塊為單位的文件系統(tǒng)的大小 Blocks count */_U32s_free_blocks_count; /* 空
23、閑塊計(jì)數(shù)器 Free blocks count */_U32s_free_inodes_count; /* 空閑索引節(jié)點(diǎn)計(jì)數(shù)器 Free inodes count */_U32s_first_data_block; /* 第一個(gè)使用的塊號(hào) First Data Block */_U32s_log_block_size; /* 塊的大小 Block size */_U32s_blocks_per_group; /* 每組中的塊數(shù) Blocks per group */_U32s_inodes_per_group; /* 每組中的節(jié)點(diǎn)數(shù) Inodes per group */_U32s_mtime
24、; /* 最后一次安裝操作的時(shí)間 Mount time */_U32s_wtime; /* 最后一次寫(xiě)操作的時(shí)間 Write time */_U16s_magic; /* 魔數(shù)簽名 Magic signature */_U32s_first_ino; /* 第一個(gè)非保留的索引節(jié)點(diǎn)號(hào) */_U16 s_inode_size; /* 磁盤(pán)上索引節(jié)點(diǎn)結(jié)構(gòu)的大小 */;#define SUPER_BLOCK_LEN sizeof(struct ext2_super_block) /56B4.2.2 組描述符在設(shè)計(jì)上 Linux 深受 BSD FFS(快速文件系統(tǒng))的影響,它的塊組與 FFS 的柱面組很
25、類(lèi)似。然而,塊組與磁盤(pán)上塊的物理布局沒(méi)有關(guān)系,因?yàn)楝F(xiàn)代驅(qū)動(dòng)器趨向于順序訪問(wèn)優(yōu)化設(shè)計(jì),并向操作系統(tǒng)隱藏了其中的物理幾何參數(shù)。這個(gè)結(jié)構(gòu)也同樣在性能上帶來(lái)好處:通過(guò)減少 i 節(jié)點(diǎn)表與數(shù)據(jù)塊之間的距離,就有可能降低磁頭對(duì)文件 I/O 操作尋道的時(shí)間,從而提高了文件存取的效率。分區(qū)在邏輯上把塊組看作是一個(gè)線性數(shù)組,所含塊組的數(shù)量取決于該分區(qū)的大小和預(yù)設(shè)的塊的大小,主要限制在于塊位圖。每個(gè)塊組中的塊位圖必須存放在 1 個(gè)單獨(dú)的塊中,用來(lái)標(biāo)識(shí)一個(gè)組中塊的占用和空閑狀況。在數(shù)據(jù)塊的大小確定以后,每個(gè)塊組的大小也同時(shí)被固定了下來(lái),由下面的公式可以得到一組重要的信息:設(shè)數(shù)據(jù)塊及分區(qū)容量分別為: N KB S KB
26、每組中含數(shù)據(jù)塊的最大數(shù): DBMAX=N*1024*8=8192*N塊組最大容量: BGSIZE=DBMAX*N=8192*N2分區(qū)中塊組最小數(shù): BGMIN=S/DBSIZE=S/(8192* N2)每個(gè)塊組與一個(gè)組描述符(ext2_group_desc,見(jiàn)includelinuxext2_fs.h)對(duì)應(yīng),組描述符記錄該塊組的一些重要信息的位置以及該塊組的空間使用情況,struct ext2_group_desc_U32bg_block_bitmap; /* 塊位圖的塊號(hào) */_U32 bg_inode_bitmap; /* 索引節(jié)點(diǎn)位圖的塊號(hào) */_U32 bg_inode_table;
27、/* 第一個(gè)索引節(jié)點(diǎn)表塊的塊號(hào) */_U16 bg_free_blocks_count; /* 組中空閑塊的個(gè)數(shù) */_U16 bg_free_inodes_count; /* 組中索引節(jié)點(diǎn)的個(gè)數(shù) */_U16 bg_used_dirs_count; /* 組中目錄的個(gè)數(shù) */_U16 bg_id; /* 該組描述副的編號(hào) */_U32bg_reserved3; /* 填充字符 */;#define GROUP_DESC_LEN sizeof(struct ext2_group_desc) /32B4.2.3 磁盤(pán)索引節(jié)點(diǎn)struct ext2_inode_U16 i_mode; /* 文件類(lèi)
28、型和訪問(wèn)權(quán)限 */_U16 i_uid; /* 擁有者標(biāo)識(shí)符 */_U32 i_size; /* 以字節(jié)為單位的文件長(zhǎng)度 */_U32 i_atime; /* 最后一次訪問(wèn)文件的時(shí)間 */_U32 i_ctime; /* 索引節(jié)點(diǎn)最后改變的時(shí)間 */_U32 i_mtime; /* 文件內(nèi)容最后改變的時(shí)間 */_U32 i_dtime; /* 文件刪除的時(shí)間 */_U16 i_gid; /* 組標(biāo)識(shí)符 */_U16 i_links_count; /* 硬鏈接計(jì)數(shù)器 */ _U32 i_blocks; /* 文件的數(shù)據(jù)塊數(shù) */_U32 i_flags; /* 文件標(biāo)志 */ _U32 i_bl
29、ockEXT2_N_BLOCKS; /* 指向數(shù)據(jù)塊的指針 */_U32 re2;#define INODE_LEN sizeof(struct ext2_inode) /644.2.4 內(nèi)存索引節(jié)點(diǎn)struct ext2_inode_info struct ext2_inode_info *i_next;struct ext2_inode_info *i_pri;_U16i_mode; /* 文件類(lèi)型和訪問(wèn)權(quán)限 */_U32i_dataEXT2_N_BLOCKS; /* 邏輯塊指針 */_U32i_count; /* 內(nèi)存關(guān)聯(lián)文件數(shù) */_U32i_inode; /* 索引接點(diǎn)編號(hào) */_U
30、8i_dirty; /* 臟數(shù)據(jù) */_U32i_links_count; /* 硬鏈接計(jì)數(shù)器 */ _U16i_blocks; /* 文件大小(以塊表示) */_U32i_size; /* 以字節(jié)為單位的文件長(zhǎng)度 */_U16 i_uid; /* 擁有者標(biāo)識(shí)符 */_U32i_atime; /* 最后一次訪問(wèn)文件的時(shí)間 */_U32i_ctime; /* 索引節(jié)點(diǎn)最后改變的時(shí)間 */_U32i_mtime; /* 文件內(nèi)容最后改變的時(shí)間 */_U32i_dtime; /* 文件刪除的時(shí)間 */;#define INODE_INFO_LEN sizeof(struct ext2_inode_i
31、nfo)4.2.5 磁盤(pán)目錄項(xiàng)結(jié)構(gòu)體在 ext2 文件系統(tǒng)中,目錄文件包含有下屬文件與子目錄的登記項(xiàng)。當(dāng)創(chuàng)建一個(gè)文件時(shí),就構(gòu)成一個(gè)目錄項(xiàng),并添加到相應(yīng)的目錄文件中。一個(gè)目錄文件可以包含很多目錄項(xiàng),每個(gè)目錄項(xiàng)(如 ext2 文件系統(tǒng)的 ext2_dir_entry_2)包含的信息如下:(1)索引節(jié)點(diǎn)號(hào)。這是相應(yīng)文件在數(shù)據(jù)塊組中的索引節(jié)點(diǎn)號(hào)碼,即檢索索引節(jié)點(diǎn)表數(shù)組的索引值。(2)目錄項(xiàng)長(zhǎng)度。記載該目錄項(xiàng)占多少字節(jié)。(3)名字長(zhǎng)度。記載相應(yīng)文件名的字節(jié)數(shù)。(4)文件類(lèi)型。用一個(gè)數(shù)字表示文件的類(lèi)型,例如,1 表示普通文件,2 表示目錄,3 表示字符設(shè)備文件,4 表示塊設(shè)備文件等。(5)文件名字。文件名
32、(不包括路徑部分)的最大長(zhǎng)度為 255 個(gè)字符。每個(gè)目錄的前兩個(gè)目錄始終是標(biāo)準(zhǔn)的“.”和“.” ,它們分別代表目錄自身和其父目錄。當(dāng)用戶(hù)需要打開(kāi)某個(gè)文件時(shí),首先要指定該文件的路徑和名稱(chēng),文件系統(tǒng)根據(jù)路徑和名稱(chēng)搜索對(duì)應(yīng)的索引節(jié)點(diǎn),找到該文件的數(shù)據(jù)塊,從而讀取文件中的數(shù)據(jù)。struct ext2_dir_entry _U32inode; /* 索引節(jié)點(diǎn)號(hào) Inode number*/_U16 rec_len; /* 目錄項(xiàng)的長(zhǎng)度 Directory entry length */ _U16 file_type; /* 文件類(lèi)型 */char nameEXT2_NAME_LEN; /* 文件名 Fi
33、le name length*/;#define DIR_ENTRY_LEN sizeof(struct ext2_dir_entry) /64B4.2.6 當(dāng)前目錄結(jié)構(gòu)體struct fs_struct _U32 count;_U32 lock;_U32 umask;struct ext2_inode_info * root, * pwd;char d_pwdEXT2_NAME_LEN,d_rootEXT2_NAME_LEN;#define FS_STRUCT_LEN sizeof(struct fs_struct)4.2.7 用戶(hù)打開(kāi)文件表結(jié)構(gòu)體struct files_struct _U
34、32 count;_U32 file_lock;/* Protects all the below members. Nests inside tsk-alloc_lock */_S32 max_fds;_S32 max_fdset;_S32 next_fd;struct file * fd;/* current fd array */struct file * fd_arrayNR_OPEN_DEFAULT;#define FILES_STRUCT_LEN sizeof(struct files_struct)4.2.8 系統(tǒng)打開(kāi)文件表結(jié)構(gòu)體struct file struct file *
35、 f_next;struct dentry* f_dentry; /* 所在目錄 */_U32f_count; /* 連接計(jì)數(shù)器 */_U32 f_flags;_U16f_mode;_U32f_pos; /* 文件位移 */_U32f_uid, f_gid;_U32f_maxcount;#define FILE_STRUCT sizeof(struct file)4.2.9 用戶(hù)結(jié)構(gòu)體#define USER_NAME_LENGTH 10#define PSDMAX 10#define PATH 40struct user_struct _U16 u_uid;_U16 u_gid;char u
36、_nameUSER_NAME_LENGTH;char u_psdPSDMAX;char u_pathPATH;#define USER_STRUCT_LEN sizeof(struct user_struct) /32B4.3 宏定義說(shuō)明#define EXT2_SUPER_MAGIC0 xEF53#define VDISKSIZE_MB 16 /* 表示磁盤(pán)為多少 M */#define BLOCKSIZE_BT 512 /* 磁盤(pán)塊的大小 (512 字節(jié)) */#define RDISKSIZE_MB(VDISKSIZE_MB-VDISKSIZE_MB%GROUPSIZE_MB)#defi
37、ne RDISKSIZE_BT(RDISKSIZE_MB*1024*1024)#define GROUPSIZE_BK (BLOCKSIZE_BT*8) /* 組容量:以邏輯塊個(gè)數(shù)表示 */#define GROUPSIZE_BT (GROUPSIZE_BK*BLOCKSIZE_BT) /* 組容量:以字節(jié)表示 */#define GROUPSIZE_MB (GROUPSIZE_BT/1024/1024) /* 組容量:以 M 表示 */#define GROUPNUM_FS(RDISKSIZE_MB/GROUPSIZE_MB) /* 文件系統(tǒng)組的總數(shù) */#define GROUPDESCN
38、UM_PBLK(BLOCKSIZE_BT/GROUP_DESC_LEN) /* 每個(gè)邏輯塊含組描述符的個(gè)數(shù) */#define GROUPDESCNUM_BK(GROUPNUM_FS/GROUPDESCNUM_PBLK) /* 組描述符占的數(shù)據(jù)塊數(shù) */#if VDISKSIZE_MB32#define GROUPDESCNUM_BK 1#endif#define DINODENUM_PGUP(BLOCKSIZE_BT*8)/* 每組含索引節(jié)點(diǎn)的個(gè)數(shù) */#define DINODENUM_PBLK(BLOCKSIZE_BT/INODE_LEN)/* 每個(gè)邏輯塊含索引節(jié)點(diǎn)的個(gè)數(shù) */#define DINODETBL_PGUP(DINODENUM_PGUP/DINODENUM_PBLK) /* 索引節(jié)點(diǎn)表占的塊數(shù) */#define DINODENUM_FS(DINODENUM_PGUP*GROUPNUM_FS) /* 索引節(jié)點(diǎn)總數(shù) */#define FREEBLKNUM_PGUP(GROUPDESCNUM_BK-4-DINODETBL_PGUP) /* 每組空閑塊數(shù) */#define FRISTDATA(4+GROUPDESCNUM_BK+DINOD
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程中介合同協(xié)議書(shū)
- 教育行業(yè)教務(wù)管理操作手冊(cè)
- 機(jī)械設(shè)備融資租賃協(xié)議書(shū)6篇
- 危險(xiǎn)貨物運(yùn)輸合同標(biāo)準(zhǔn)
- 《初高中英語(yǔ)語(yǔ)法講解與練習(xí)課教案》
- 2025年湖北怎么考貨運(yùn)從業(yè)資格證
- 2025年臨汾貨運(yùn)從業(yè)資格證考試內(nèi)容
- 2025年商鋪轉(zhuǎn)讓合同8篇
- 雙方付款合同范本
- 廠地合作合同范本
- 供應(yīng)鏈中的社會(huì)責(zé)任
- 早期教育概論(高職學(xué)前教育專(zhuān)業(yè))全套教學(xué)課件
- 《AutoCAD 中文版實(shí)例教程(AutoCAD 2020) (微課版)(第 2 版)》課件 馬連志 第3、4章 基本繪圖操作、高級(jí)繪圖操作
- 產(chǎn)品國(guó)產(chǎn)化證明書(shū)
- 詢(xún)價(jià)投標(biāo)文件(范本)
- 幼兒教師職業(yè)道德(高職學(xué)前教育專(zhuān)業(yè))全套教學(xué)課件
- 蘇科版八年級(jí)生物下冊(cè)全冊(cè)完整課件
- 第四單元復(fù)習(xí)教學(xué)設(shè)計(jì) 部編版語(yǔ)文七年級(jí)上冊(cè)
- 醫(yī)學(xué)專(zhuān)家談靈芝孢子粉課件
- 開(kāi)心麻花《白蛇前傳》劇本
- 全部編版三年級(jí)語(yǔ)文下冊(cè)生字讀音、音序、偏旁及組詞
評(píng)論
0/150
提交評(píng)論