inode、目錄、路徑
時(shí)間:2021-09-29 15:22:35
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]文件系統(tǒng)本文繼續(xù)來(lái)看的文件系統(tǒng)部分,將文件系統(tǒng)的設(shè)計(jì)分為7層:磁盤緩存區(qū)日志目錄路徑文件系統(tǒng)調(diào)用,磁盤、緩存區(qū)、日志三個(gè)部分在前文已經(jīng)說(shuō)了,本文接著講述,目錄,路徑三個(gè)層次。這部分的理論知識(shí)可以參考文章:捋一捋文件系統(tǒng)。本文直接來(lái)看xv6的文件系統(tǒng)這部分是如何實(shí)現(xiàn)的。文件系統(tǒng)布局再來(lái)系統(tǒng)的看看xv6文件系統(tǒng)的布局圖:這個(gè)圖與文檔給出的布局圖有些不一樣,主要是日志區(qū)的位置變化了。文檔給出的布局圖日志區(qū)位于文件系統(tǒng)的末尾,但是根據(jù)源碼來(lái)看日志區(qū)應(yīng)該是位于超級(jí)塊后面的。前文直接用的文檔中的圖,應(yīng)該是有誤的,實(shí)在抱歉。我看了幾個(gè)版本的源碼和文檔,源碼是日志區(qū)都是安排在超級(jí)塊后面,而文檔的布局圖描述的是...
文件系統(tǒng)
本文繼續(xù)來(lái)看 的文件系統(tǒng)部分, 將文件系統(tǒng)的設(shè)計(jì)分為 7 層: ,磁盤、緩存區(qū)、日志三個(gè)部分在前文已經(jīng)說(shuō)了,本文接著講述 ,目錄,路徑三個(gè)層次。這部分的理論知識(shí)可以參考文章:捋一捋文件系統(tǒng)。本文直接來(lái)看 xv6 的文件系統(tǒng)這部分是如何實(shí)現(xiàn)的。文件系統(tǒng)布局
再來(lái)系統(tǒng)的看看 xv6 文件系統(tǒng)的布局圖:引導(dǎo)塊、超級(jí)塊
第 0 塊是引導(dǎo)塊,里面存放的啟動(dòng)程序也就是 ,詳見前文:實(shí)例講解多處理器下的計(jì)算機(jī)啟動(dòng)第 1 塊是超級(jí)塊,存有文件系統(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??//第一個(gè)日志塊塊號(hào)?
??uint?inodestart;???//?Block?number?of?first?inode?block??//第一個(gè)i結(jié)點(diǎn)所在塊號(hào)
??uint?bmapstart;????//?Block?number?of?first?free?map?block??//第一個(gè)位圖塊塊號(hào)
};
可以看出超級(jí)塊實(shí)則就是文件系統(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)的各個(gè)部分從哪開始,到哪結(jié)束都是可以明確計(jì)算出來(lái)的,所以其實(shí)不管將日志區(qū)安排在哪,我們都可以從超級(jí)塊中獲取相應(yīng)的位置大小信息。數(shù)據(jù)區(qū)
緊接著超級(jí)塊的區(qū)域應(yīng)該是 ,但是 的內(nèi)容有些多有些復(fù)雜,我們放在后面講,先來(lái)看看數(shù)據(jù)區(qū)中數(shù)據(jù)塊的組織與管理。數(shù)據(jù)塊的分配和釋放由位圖來(lái)管理,但位圖管理的區(qū)域不止數(shù)據(jù)區(qū),而是整個(gè)文件系統(tǒng)。有關(guān)位圖的宏定義如下://?Bitmap?bits?per?block????每個(gè)塊能有多少個(gè)bit
#define?BPB???????????(BSIZE*8)
//?Block?of?free?map?containing?bit?for?block?b????塊b在哪個(gè)位圖塊上
#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)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。