www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > Linux閱碼場
[導(dǎo)讀]文件系統(tǒng)本文繼續(xù)來看的文件系統(tǒng)部分,將文件系統(tǒng)的設(shè)計分為7層:磁盤緩存區(qū)日志目錄路徑文件系統(tǒng)調(diào)用,磁盤、緩存區(qū)、日志三個部分在前文已經(jīng)說了,本文接著講述,目錄,路徑三個層次。這部分的理論知識可以參考文章:捋一捋文件系統(tǒng)。本文直接來看xv6的文件系統(tǒng)這部分是如何實現(xiàn)的。文件系統(tǒng)布局再來系統(tǒng)的看看xv6文件系統(tǒng)的布局圖:這個圖與文檔給出的布局圖有些不一樣,主要是日志區(qū)的位置變化了。文檔給出的布局圖日志區(qū)位于文件系統(tǒng)的末尾,但是根據(jù)源碼來看日志區(qū)應(yīng)該是位于超級塊后面的。前文直接用的文檔中的圖,應(yīng)該是有誤的,實在抱歉。我看了幾個版本的源碼和文檔,源碼是日志區(qū)都是安排在超級塊后面,而文檔的布局圖描述的是...

文件系統(tǒng)

本文繼續(xù)來看 的文件系統(tǒng)部分, 將文件系統(tǒng)的設(shè)計分為 7 層: ,磁盤、緩存區(qū)、日志三個部分在前文已經(jīng)說了,本文接著講述 ,目錄,路徑三個層次。

這部分的理論知識可以參考文章:捋一捋文件系統(tǒng)。本文直接來看 xv6 的文件系統(tǒng)這部分是如何實現(xiàn)的。

文件系統(tǒng)布局

再來系統(tǒng)的看看 xv6 文件系統(tǒng)的布局圖:

這個圖與 文檔給出的布局圖有些不一樣,主要是日志區(qū)的位置變化了。 文檔給出的布局圖日志區(qū)位于文件系統(tǒng)的末尾,但是根據(jù)源碼來看日志區(qū)應(yīng)該是位于超級塊后面的。前文直接用的 文檔中的圖,應(yīng)該是有誤的,實在抱歉。我看了幾個版本的 源碼和文檔,源碼是日志區(qū)都是安排在超級塊后面,而文檔的布局圖描述的是將日志區(qū)放在末尾。不過這不是重點(diǎn),不影響咱們理解,不管位于哪兒,在超級塊中做相應(yīng)修改就行。

引導(dǎo)塊、超級塊

第 0 塊是引導(dǎo)塊,里面存放的啟動程序也就是 ,詳見前文:實例講解多處理器下的計算機(jī)啟動

第 1 塊是超級塊,存有文件系統(tǒng)的元信息,相關(guān)結(jié)構(gòu)體定義如下:

struct?superblock?{
??uint?size;?????????//?Size?of?file?system?image?(blocks)?文件系統(tǒng)大小,也就是一共多少塊
??uint?nblocks;??????//?Number?of?data?blocks??數(shù)據(jù)塊數(shù)量
??uint?ninodes;??????//?Number?of?inodes.???//i結(jié)點(diǎn)數(shù)量
??uint?nlog;?????????//?Number?of?log?blocks???//日志塊數(shù)量??
??uint?logstart;?????//?Block?number?of?first?log?block??//第一個日志塊塊號?
??uint?inodestart;???//?Block?number?of?first?inode?block??//第一個i結(jié)點(diǎn)所在塊號
??uint?bmapstart;????//?Block?number?of?first?free?map?block??//第一個位圖塊塊號
};
可以看出超級塊實則就是文件系統(tǒng)布局的信息集合。在 中我們可以知道:

#define?NINODES?200
#define?MAXOPBLOCKS??10?
#define?LOGSIZE??????(MAXOPBLOCKS*3)?
#define?FSSIZE???????1000
#define?IPB???????????(BSIZE?/?sizeof(struct?dinode))


int?nbitmap?=?FSSIZE/(BSIZE*8)? ?1;??
int?ninodeblocks?=?NINODES?/?IPB? ?1;???
int?nlog?=?LOGSIZE;???

int?nmeta?=?2? ?nlog? ?ninodeblocks? ?nbitmap;
int?nblocks?=?FSSIZE?-?nmeta;

int?logstart?=?2;
int?inodestart?=?2? ?nlog;
int?bmapstart?=?2? ?nlog? ?ninodeblocks;
從上述代碼可以看出,文件系統(tǒng)的各個部分從哪開始,到哪結(jié)束都是可以明確計算出來的,所以其實不管將日志區(qū)安排在哪,我們都可以從超級塊中獲取相應(yīng)的位置大小信息。

數(shù)據(jù)區(qū)

緊接著超級塊的區(qū)域應(yīng)該是 ,但是 的內(nèi)容有些多有些復(fù)雜,我們放在后面講,先來看看數(shù)據(jù)區(qū)中數(shù)據(jù)塊的組織與管理。

數(shù)據(jù)塊的分配和釋放由位圖來管理,但位圖管理的區(qū)域不止數(shù)據(jù)區(qū),而是整個文件系統(tǒng)。有關(guān)位圖的宏定義如下:

//?Bitmap?bits?per?block????每個塊能有多少個bit
#define?BPB???????????(BSIZE*8)
//?Block?of?free?map?containing?bit?for?block?b????塊b在哪個位圖塊上
#define?BBLOCK(b,?sb)?(b/BPB? ?sb.bmapstart)

分配回收

static?uint?balloc(uint?dev)
{
??int?b,?bi,?m;
??struct?buf?*bp;

??bp?=?0;
??for(b?=?0;?b?????bp?=?bread(dev,?BBLOCK(b,?sb));???????//讀取位圖信息
????for(bi?=?0;?bi?
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉