Linux 0 11 檔案系統

2021-05-22 10:49:19 字數 3026 閱讀 7446

每乙個程序都有乙個flip存放著乙個索引,該索引就是核心檔案表的索引,而檔案表中的項又指向記憶體i結點表中的一項,這樣程序就要以操作乙個檔案了。

=null;

for(i=0;is_zmap=null;

block=2;

for(i=0;is_imap_blocks;i++)

if(s->s_imap

=bread(dev,block))

block++;

else

break;

for(i=0;is_zmap_blocks;i++)

if(s->s_zmap=bread(dev,block))

block++;

else

break;

//如果讀出的塊數不等於因該站有的塊數,則說明檔案系統點陣圖有問題,則釋放掉所有申請的資源後退出

if(block!=2+s->s_imap_blocks+s->s_zmap_blocks)

//對於申請空閒i節點的函式來講,如果裝置上所與的i節點都被使用,則返回為0。所以0號節點不能使用,邏輯塊也是如此。

s->s_imap[0]->b_data[0]|=1;

s->s_zmap[0]->b_data[0]|=1;

//解鎖超級塊,返回超級塊指標。       

free_super(s);

return s;       

}

核心檔案表中存放的是核心開啟的所有檔案的資訊,記憶體i結點表中存放的是核心要操作的磁碟檔案的i結點資訊。如指向資料檔案的i結點,指向裝置檔案的i結點等。

但是在核心中只有上述資料結構還不能對檔案系統進行操作,因數每一種檔案系統都有自己的超級塊,在超級塊中存放著該檔案系統的相關資訊,所以在核心中有乙個超級塊表,它記錄著核心所使用的各種檔案系統的超級塊資訊。超級塊表中除了會把磁碟上超級塊內容載入進來以外,還會記錄另外一些資訊特別要指出的是[i結點點陣圖在高速緩衝塊的指標陣列]和[邏輯塊點陣圖在高速緩衝塊的指標陣列]。這說明什麼?說明系統在載入超級塊資訊時會連同[i結點位圖][邏輯塊點陣圖]和更多資訊一起載入到記憶體中。

檔案系統和記憶體管理,以及程序管理是作業系統的核心部分。資料通常以檔案的形式儲存在裝置上,因此檔案系統的基本功能就是以某種格式訪問/控制檔案。0.11版的核心中採用了minix1.0版的檔案系統。在最新的2.6版核心中,借助於 vfs,系統支援50多種檔案系統。

首先介紹一下minix檔案系統

minix檔案系統和標準unix檔案系統基本相同。它由6個部分組成,分別是:引導塊,超級塊,i節點位圖,邏輯塊點陣圖,i節點,和資料區。如果存放檔案系統的裝置不是引導裝置,那麼引導塊可以為空。pc機的塊裝置通常以512位元組為乙個扇區,而檔案系統則以盤塊為單位使用之。minix中1個盤塊等於2個扇區大小。從引導塊為第0個盤塊開始計算。邏輯塊可以為2^n個盤塊,minix中邏輯塊大小等於盤塊。所以盤塊=邏輯塊=緩衝塊=1024位元組。超級塊存放檔案系統的整體資訊。i節點位圖描述了i節點的使用情況。檔案通常將控制資訊和資料分開存放,i節點就是存放檔案的控制資訊的,通常稱之為inode。邏輯塊點陣圖則描述了邏輯塊的使用情況。

linux中的 檔案範圍很廣泛,不僅僅指普通檔案。用ls -l命令可以發現顯示的資訊的最左邊字元可以為"-","d","s","p","b","c",分別表示正規檔案,目錄檔案,符號連線,命名管道,塊裝置,字元裝置檔案。緊跟在其後的9位字元可以為r,w,x,s,s等,描述了檔案的訪問許可權。後面的資訊有檔案的使用者名稱,組名,檔案大小,修改日期等,這些資訊當然是放在inode中的。檔名除外。那麼檔案系統是如何被載入的呢?在系統啟動過程中,具體是在任務1的init()函式中,通過setup系統呼叫載入的,該函式呼叫mount_root()函式讀取根檔案系統的超級塊和根inode節點。

下面,就結合檔案系統的上述要素,及其資料結構講解minix1.0檔案系統。

1.超級塊

struct super_block;

每個檔案系統都要有乙個超級塊。核心維護乙個超級塊陣列:

struct super_block super_block[nr_super];

當乙個檔案系統被載入時,就將它的超級塊讀到這個陣列中,並讀取它的i節點和邏輯塊位圖到super_block的相應陣列中。解除安裝乙個檔案系統時就執行相反的操作。

super.c 檔案中實現了對超級塊的操作,包括get_super,put_super,read_super,另外還有sys_umount,sys_mount, mount_root函式。get_super是從超級塊陣列中搜尋指定裝置的超級塊。所以它要求相應的檔案系統已載入或者已讀到陣列中。 read_super則是從盤上讀取超級塊。put_super是釋放超級塊以及相應的點陣圖,這在sys_umount函式中被呼叫。

我們來看一下read_super這個函式。

static struct super_block *read_super(int dev)

//找到空項後初始化它

s->s_dev=dev;

s->s_isup=null;

s->s_imount=null;

s->s_time=0;

s->s_rd_only=0;

s->s_dirt=0;

//然後鎖定該超級塊,並從裝置上讀取超級塊。超級塊在第1塊

lock_super(s);

if(!(bh=bread(dev,1))

s->s_dev=0;

free_super(s);

return null;

}

//然後將讀取到的超級塊從緩衝塊讀到超級塊陣列中

*((struct d_super_block*)s)=*((struct d_super_block*)bh->data);

brelse(bh);

//判斷檔案系統魔數是不是0x137f,minix的魔數

if(s->s_magic!=super_magic)

//然後就讀取裝置上的i節點和邏輯塊位圖到緩衝區中,先初始化指標陣列。i_map_slots和z_map_slots都等於8,所以共有1024*8*8個位元用於描述邏輯塊。而每個邏輯塊為1024位元組,所以minix1.0最大支援64m的檔案系統。

for(i=0;is_imap

linux 0 11 檔案系統(二)

超級塊描述了整個檔案系統的資訊,而檔案作為儲存的物件,它的資訊是有inode節點來描述的。i節點位圖描述了inode的使用情況。struct m inode 其 中i zone 9 很重要,它指出了檔案使用的裝置的邏輯塊號。其中0 6為直接塊,也就是檔案的資料直接在相應的邏輯塊上 7位1級塊,1級塊...

linux 0 11 檔案系統(二)

超級塊描述了整個檔案系統的資訊,而檔案作為儲存的物件,它的資訊是有inode節點來描述的。i節點位圖描述了inode的使用情況。struct m inode 其 中i zone 9 很重要,它指出了檔案使用的裝置的邏輯塊號。其中0 6為直接塊,也就是檔案的資料直接在相應的邏輯塊上 7位1級塊,1級塊...

Linux 0 11 系統呼叫學習

通過增加乙個系統呼叫來了解系統呼叫的實現原理。增加 int fun void 1 在include unistd.h 中加入 define nr fun72 加入系統函式呼叫宣告 int fun void 2.在include linux sys.h 加入系統函式宣告 extern int sys ...