The File System in JOS

The File System in JOS


單獨開一貼扯一扯JOS裏的文件系統

也是方便以後更新或引用.


集中火力看幾個和文件系統有關係的頭文件.

 inc/fs.h 

 fs/fsformat.h 

 fs/fs.h

fs/serv.c


先回答一下神馬是文件系統...


File system


    The xv6 file system provides data files, which are uninterpreted byte arrays, and directories, which contain named references to data files and other directories. Xv6 implements directories as a special kind of file. The directories form a tree, starting at a special directory called the root. A path like /a/b/c refers to the file or directory
named c inside the directory named b inside the directory named a in the root directory /. Paths that don’t begin with / are evaluated relative to the calling process’s current directory, which can be changed with the chdir system call


在fs/serv.c裏面一開始就有很詳細的註釋介紹.

JOS的文件系統由三大結構構成

1. 用於描述硬盤上文件的struct File

2.用於描述每一個打開的文件的struct Fd (file descriptor)

3. struct OpenFile 用於鏈接以上兩個結構體




對於硬盤的,每一個Block的大小就是一個PGSIZE大小(4KB)

支持的單個文件名(當前某一路徑下的文件名,不是絕對路徑)最長是128個字符,包括字符串結束符

支持的絕對路徑文件名是1024個字符,包括字符串結束符



文件的最大規格是MAXFILESIZE


下面是利用了結構體struct File對"文件"這一概念進行的抽象



下圖是對於硬盤佈局的描述圖


第一扇區是boot, 用於儲存系統的啓動信息

第二個是super, 用於

第三個區域用於記錄各種inode,由於是連續區域,方便index 索引.後面就是實際儲存數據的區域了.

最後是log區域.



文件的類型也就兩種,一種普通的文件,一種是目錄

上面見過文件的抽象了 struct File

對於目錄,用於描述目錄的結構體在 fs/fsformat.h裏面


我們能看到,對於一個目錄來說,繼承自結構體struct File,實質上目錄也是個文件,只是這個文件提供各種其他普通文件的入口,並計數,一個目錄能裝的最大文件數目是 MAX_DIR_ENTS 128




值得注意的是第一個初始化的文件,是啥?根目錄哇...

描述根目錄的結構體 struct OpenFile被初始化爲 0, 0 , 1 ,0

這裏的這個1就是O_WRONLY

可以在inc/lib.h裏面能找到各種文件打開權限(如果你看過APUE,就會有種老鄉見老鄉的感覺了...)





我們看看,究竟是怎麼創建起一個文件系統的~

去kern/init.c裏面.你會發現這裏第一個被創建的內核創建的進程是 fs_fs.



下面是鏈接器的信息 fs_fs進程對應的起始地址在0xf01c9efe


下面是fs/Makefrag 的部分信息,生成程序fs/fs



重點來了,第一個進程用來初始化文件系統的進程fs_fs對應serv.c裏面的umain.c


這裏會有serve_init()還有fs_init()的初始化.


最後調用serve()啓動文件系統服務


我們看看serve_init()


看,這裏就是初始化opentab結構體數組.


這裏值得注意的是FILEVA,這個地址開始,爲每個文件儲存對應的struct Fd,每個文件佔用1頁的大小.

在inc/fd.h裏面你能看到這下面兩個結構體,struct Fd定義如下:



對於 fs_init()



能很明顯的看到super指針被賦值爲指向硬盤第一塊block的區域.(第0塊是boot block)

bitmap指向第二塊區域.

最後程序調用serve()函數開始啓動文件系統的服務




這個文件系統進程基於進程通信完成對硬盤文件的讀寫!


大體的文件系統構造就是這樣,後續如果有必要會繼續update ...

主要是爲lab 5做鋪墊準備



  "故事的小黃花 從出生那年就飄着"






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章