1. 程式人生 > 實用技巧 >MIT 6.828 Lab 05:File system, Spawn and Shell

MIT 6.828 Lab 05:File system, Spawn and Shell

MIT 6.828 Lab5:File system, Spawn and Shell


目錄



概括總結

本lab將實現JOS的檔案系統,只要包括如下四部分:

  1. 引入一個檔案系統程序(FS程序)的特殊程序,該程序提供檔案操作的介面。
  2. 建立RPC機制,客戶端程序向FS程序傳送請求,FS程序真正執行檔案操作,並將資料返回給客戶端程序。
  3. 更高階的抽象,引入檔案描述符。通過檔案描述符這一層抽象就可以將控制檯,pipe,普通檔案,統統按照檔案來對待。(檔案描述符和pipe實現原理)
  4. 支援從磁碟載入程式並執行。

File system preliminaries

我們要完成一個相對簡單的檔案系統,其可以實現建立、讀、寫以及刪除在分層目錄結構中組織的檔案。目前我們的OS只支援單使用者,因此我們的檔案系統也不支援UNIX檔案擁有或許可權的概念。同時也不支援硬連結、符號連結、時間戳或是特別的裝置檔案。

On-Disk File System Structure

大多是 Unix 檔案系統將磁碟空間分為 inode和資料 區域。目錄包含檔名和指向inode的指標; 如果檔案系統中的多個目錄引用該檔案的inode,則稱檔案是硬連結的。由於我們的檔案系統不需要支援硬連結,因此我們不需要這一間接層並且能做一個方便的簡化:我們的檔案系統根本不使用inode

,相反我們僅僅將所有檔案(或子目錄)的 meta-data儲存在描述該檔案的唯一的目錄中(directory entry)。 檔案和目錄邏輯上都是由一系列資料blocks組成,這些blocks分散在磁碟中,檔案系統遮蔽blocks分佈的細節,提供一個可以順序讀寫檔案的介面。

補充:inode

inode其實本質就是作業系統課程學習的“索引結點”。剛開始看到這裡其實有點混亂,感覺不知道對應學的哪部分知識(可能是因為上學期學作業系統是中文學的,有些名詞對不上)。複習了檔案系統的知識之後,恍然發現這就是索引結點

檔案儲存在硬碟上,硬碟的最小儲存單位叫做“扇區”(Sector)。每個扇區儲存512位元組(相當於0.5KB)。

作業系統讀取硬碟的時候,不會一個個扇區的讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個“塊”(block)。這種由多個扇區組成的“塊”,是檔案存取的最小單位。“塊”的大小,最常見的是4KB,即連續八個sector組成一個block。

檔案資料都儲存在“塊”中,那麼很顯然,我們還必須找到一個地方儲存檔案的“元資訊”,比如檔案的建立者、檔案的建立日期、檔案的大小等等。這種儲存檔案元資訊的區域就叫做*inode*,中文譯名為"*索引節點*"。

每一個檔案都有對應的inode,裡面包含了與該檔案有關的一些資訊。

Sectors and Blocks

大部分磁碟都是以Sector為粒度進行讀寫,JOS中Sectors為512位元組。檔案系統以block為單位分配和使用磁碟。注意區別,sector size是磁碟的屬性,block size是作業系統使用磁碟的粒度。JOS的檔案系統的block size被定為4096位元組 ( 4kB ) 。

Superblocks

檔案系統使用一些特殊的block儲存檔案系統屬性元資料,比如block size, disk size, 根目錄位置等。這些特殊的block叫做superblocks
我們的檔案系統使用一個superblock,位於磁碟的block 1block 0被用來儲存boot loader和分割槽表

struct Super {
    uint32_t s_magic;        // Magic number: FS_MAGIC
    uint32_t s_nblocks;        // Total number of blocks on disk
    struct File s_root;        // Root directory node
};

File Meta-data

我們的檔案系統使用struct File結構描述檔案,該結構包含檔名,大小,型別,儲存檔案內容的block號。struct File結構的f_direct陣列儲存前NDIRECT(10)個block號,這樣對於10*4096=40KB的檔案不需要額外的空間來記錄內容block號。對於更大的檔案我們分配一個額外的block來儲存4096/4=1024 block號。