minix檔案系統

2021-06-20 19:10:42 字數 3740 閱讀 5288

2009-06-14 02:40

1791人閱讀收藏 

舉報struct

null

buffer

資料結構

numbers

disk

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=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;       }

minix檔案系統的物理結構

--1) minix檔案系統是一種簡單而又樸素的檔案系統, ext2檔案系統可看成是對minix的改進, 可以將每乙個ext2塊組看成乙個微型的minix檔案系統. 

--2) minix檔案系統的塊長只允許為1k, 第1塊為啟動塊, 第2塊為超級塊, 從第3塊開始, 依次為inode位圖塊組, 資料塊位圖塊組, inode塊組, 最後為資料塊組. 

--3) minix檔案系統的目錄項由16位inode編號和定長的檔名區域組成, inode從1開始編號, 編號0標記刪除的目錄項, 編號1為根目錄項. 目錄項分為16位元組版和32位元組版, 最長檔名分別為14和30. 

--4) minix檔案系統的inode分為32位元組版(minix_inode)和64位元組版(minix2_inode). minix_inode只有1個時戳標記, 使用者組號(i_gid)為8位, 它包含由9個16位字組成的二重檔案索引表. minix2_inode則使用3個檔案時戳, 16位gid和10個32位字組成的三重檔案塊索引表. 

--5) 根據目錄項和inode尺寸的不同, minix檔案系統盤分為4種格式化版本, 其s_magic分別為0x137f, 0x138f, 0x2468, 0x2478. 

--; include/linux/minix_fs.h:

/** minix super-block data on disk

*/struct minix_super_block ;

/** this is the original minix inode layout on disk.

* note the 8-bit gid and atime and ctime.

*/struct minix_inode ;

/** the new minix inode has all the time entries, as well as

* long block numbers and a third indirect block (7+1+1+1

* instead of 7+1+1). also, some previously 8-bit values are

* now 16-bit. the inode is now 64 bytes instead of 32.

*/struct minix2_inode ;

struct minix_dir_entry ;

Minix檔案系統概述

minix檔案系統是乙個邏輯的 自包含的實體。在磁碟上它由六部分組成,分別是 引導塊,超塊 i 節點 i 節點位圖 區段位圖 資料塊。具體結構如下圖所示 每個檔案系統都以引導塊開始,引導塊的最後兩個位元組是魔數0x55aa.引導塊大小為資料塊的一塊,一般為512位元組。啟動計算機時,硬體從引導裝置將...

Minix檔案系統在Linux 4 19核心的編譯

ubuntu16.04虛擬機器 核心版本 v4.19 minix原始碼獲取 minix原始碼在linux原始碼 fs minix 目錄 進入minix目錄,修改makefile為obj config minix fs minix.o minix objs bitmap.o itree v1.o it...

檔案系統 why檔案系統

為什麼需要檔案系統,可否由作業系統直接寫裸裝置?裸裝置是一種沒有經過格式化的磁碟或分割槽,即讓作業系統直接管理操作磁碟設定,進行資料讀寫等。通過檔案系統的方式組織磁碟儲存和資料管理有很多好處,比如 1.資料讀取 管理等操作變得簡單便捷 檔案系統給使用者提供了乙個簡單的操作介面,只需簡單的操作就能實現...