本文沒有按照 XV6 官方文本的順序介紹
概觀#
- XV6 的檔案系統分為 6 層,本文將從上到下介紹。
檔案描述符#
File: proc.h
- UNIX 大部分的資源都是一個文件,而此統一性由檔案描述符實現。
- 每個 process 都有一個表記錄著開啟的文件(行 13),一個開啟的文件即為
struct file
37 | // Per-process state |
File: file.h
1 | struct file { |
File: proc.c
- 所有的 open files 皆被存放在
ftable
中:
struct { |
File: file.c
Code: filealloc、dup and close#
功能 | 回傳值 |
---|---|
建立一個檔案 | 檔案結構 |
25 | // Allocate a file structure. |
filealloc
在ftable
找到一個f->ref
為零的,並返回。
功能 | 回傳值 | *f |
---|---|---|
再次一個檔案 | 開啟的檔案結構 | 欲開啟的檔案 |
43 | // Increment ref count for file f. |
filedup
增加引用次數。
功能 | 回傳值 | *f |
---|---|---|
關閉檔案 | void | 欲關閉的檔案 |
55 | // Close file f. (Decrement ref count, close when reaches 0.) |
fileclose
減少引用次數。
68 | ff = *f; |
- 若引用次數降為 0 時,則依據類型的不同釋放當前的 pipe 或是 inode。
Code: filestat、read and write#
功能 | 回傳值 |
---|---|
讀取檔案狀態 | 0 (ok) / -1 (err) |
*f |
*st |
---|---|
欲讀取的檔案 | 寫入狀態的結構 |
83 | // Get metadata about file f. |
- 須為
inode
才可使用filestat
,通過呼叫stati
來實現操作。
Code: fileread
功能 | 回傳值 |
---|---|
讀取檔案 | 讀取大小 |
*f |
*addr |
n |
---|---|---|
欲讀取的檔案 | 欲寫入資料的記憶體 | 欲寫入的大小 |
95 | // Read from file f. |
fileread
針對不同類型有不同的操作:- pipe:呼叫
piperead
,於 ch5 介紹過。 - inode:由
readi
完成動作,下面會介紹。
- pipe:呼叫
功能 | 回傳值 |
---|---|
寫入檔案 | 寫入大小 |
*f |
*addr |
n |
---|---|---|
欲寫入的檔案 | 欲寫入的資料 | 欲寫入的大小 |
115 | //PAGEBREAK! |
filewrite
針對不同類型有不同的操作:- pipe:呼叫
pipewrite
,於 ch5 介紹過。 - inode:由
writei
完成動作,下面會介紹。
- pipe:呼叫
File: fs.c
功能 | 回傳值 |
---|---|
寫入檔案狀態 | void |
*ip |
*st |
---|---|
欲讀取的檔案 | 寫入狀態的結構 |
437 | // Copy stat information from inode. |
Code: Path names#
namex#
功能 | 回傳值 |
---|---|
從路徑尋找檔案 | inode 結構 |
*path |
nameiparent |
*name |
---|---|---|
路徑名 | - | - |
620 | // Look up and return the inode for a path name. |
Code: 目錄#
- 目錄的 inode type 為
T_DIR
,存在struct dirent
中。
File: file.
53 | struct dirent { |
inum
為 inode 編號,為 0 的代表可用。
Inode#
Logging#
Buffer#
- buffer 有兩個任務:
- 同步硬碟,保證只會有一份拷貝放在記憶體,並只有一個 kernel thread 使用。
- 快取常用的 block 以提升性能 (bio.c);