檔案系統:如何找到由 inode 表示的檔案區塊?

檔案系統:如何找到由 inode 表示的檔案區塊?

我正在為我的作業系統編寫一個檔案系統,並在開始設計自己的檔案系統之前對現有檔案系統進行研究。我看到了一些有關係統五文件系統的幻燈片,並且對如何找到文件塊感到非常困惑。

例如,如果我想找到由 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

相關內容