我正在為我的作業系統編寫一個檔案系統,並在開始設計自己的檔案系統之前對現有檔案系統進行研究。我看到了一些有關係統五文件系統的幻燈片,並且對如何找到文件塊感到非常困惑。
例如,如果我想找到由 inode 12 表示的檔案的區塊 5...我該怎麼做?
有人可以(在高層次上)解釋如何找到由 inode 表示的檔案區塊嗎?
答案1
從 Ultrix 3.0 v7 取得的結構restor
可能會出現以下變化:
ftp://ftp.uvsq.fr/pub/tuhs/PDP-11/Distributions/dec/Ultrix-3.0/v7restor/include/sys/
s5fs 相當陳舊,但是......:
磁碟佈局可能類似於:
[B][S][Inode List][ Data Blocks ]
| |
| +-- Super Block
+----- Boot Area
這超級街區儲存檔案系統的資料。這索引節點列表是儲存檔案(包括目錄)資料的 inode 數組,指針到駐留在的數據資料區塊。
這索引節點列表是固定大小的。
結構超級街區在磁碟上:
struct filsys {
unsigned short s_isize; /* size in blocks of i-list */
daddr_t s_fsize; /* size in blocks of entire volume */
short s_nfree; /* number of addresses in s_free */
daddr_t s_free[NICFREE]; /* free block list */
short s_ninode; /* number of i-nodes in s_inode */
ino_t s_inode[NICINOD];/* free i-node list */
char s_flock; /* lock during free list manipulation */
char s_ilock; /* lock during i-list manipulation */
char s_fmod; /* super block modified flag */
char s_ronly; /* mounted read-only flag */
time_t s_time; /* last super block update */
daddr_t s_tfree; /* total free blocks*/
ino_t s_tinode; /* total free inodes */
short s_m; /* interleave factor */
short s_n;
char s_fname[6]; /* file system name */
char s_fpack[6]; /* file system pack name */
long s_unique; /* saved unique number (sys unique) */
};
的結構索引節點在磁碟上:
struct dinode
{
unsigned short di_mode; /* mode and type of file */
short di_nlink; /* number of links to file */
short di_uid; /* owner's user id */
short di_gid; /* access control file (was gid) */
off_t di_size; /* number of bytes in file */
char di_addr[40]; /* disk block addresses */
time_t di_atime; /* time last accessed */
time_t di_mtime; /* time last modified */
time_t di_ctime; /* time created */
};
di_mode
會告訴你它是否是常規檔案、目錄、命名管道等以及它擁有什麼權限。
您具體詢問的是di_addr
.它保存了 13 個三位元組位址,總共 39 個位元組。最後一個位元組被某些系統用作目錄的檔案建立遮罩。
lib.c
來源根目錄下的檔案(restor
請參閱上方)包含用於將 long 與 3 位元組磁碟位址相互轉換的函數。
前10個是直接指針,第11-13個是間接指針。
當您請求區塊號 5 時,這將是一個直接指標。讀取它的值並從該區塊讀取資料。
另一個參考:http://erdos.csie.ncnu.edu.tw/~ccyang/Os2/Slides/chapter9.ppt