MIT 6.828 Lab 05:File system, Spawn and Shell
MIT 6.828 Lab5:File system, Spawn and Shell
目錄
- MIT 6.828 Lab5:File system, Spawn and Shell
- File system preliminaries
- The File System
- The Block Cache
- The Block Bitmap
- File Operations
- The file system interface
- Spawning Processes
- Sharing library state across fork and spawn
概括總結
本lab將實現JOS的檔案系統,只要包括如下四部分:
- 引入一個檔案系統程序(FS程序)的特殊程序,該程序提供檔案操作的介面。
- 建立RPC機制,客戶端程序向FS程序傳送請求,FS程序真正執行檔案操作,並將資料返回給客戶端程序。
- 更高階的抽象,引入檔案描述符。通過檔案描述符這一層抽象就可以將控制檯,pipe,普通檔案,統統按照檔案來對待。(檔案描述符和pipe實現原理)
- 支援從磁碟載入程式並執行。
File system preliminaries
我們要完成一個相對簡單的檔案系統,其可以實現建立、讀、寫以及刪除在分層目錄結構中組織的檔案。目前我們的OS只支援單使用者,因此我們的檔案系統也不支援UNIX檔案擁有或許可權的概念。同時也不支援硬連結、符號連結、時間戳或是特別的裝置檔案。
On-Disk File System Structure
大多是 Unix 檔案系統將磁碟空間分為 inode
和資料 區域。目錄包含檔名和指向inode的指標; 如果檔案系統中的多個目錄引用該檔案的inode,則稱檔案是硬連結的。由於我們的檔案系統不需要支援硬連結,因此我們不需要這一間接層並且能做一個方便的簡化:我們的檔案系統根本不使用inode
補充: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 1。block 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號。