ファイルシステム: inode で表されるファイルのブロックを見つけるにはどうすればよいでしょうか?

ファイルシステム: inode で表されるファイルのブロックを見つけるにはどうすればよいでしょうか?

私は自分のオペレーティング システム用のファイル システムを作成しており、独自の設計を開始する前に既存のファイル システムについて調査しています。System Five ファイル システムに関するスライドをいくつか見たのですが、ファイル ブロックがどのように見つかるかがかなりわかりません。

たとえば、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 リストファイル(ディレクトリを含む)のデータを保持するinodeの配列であり、ポインタ保存されているデータにデータブロック

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) */
};

の構造iノードディスク上:

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 個の 3 バイト アドレス (合計 39 バイト) を保持します。最後のバイトは、一部のシステムでディレクトリのファイル作成マスクとして使用されます。

lib.cソースのルートにあるファイル(restor上部を参照) には、long を 3 バイトのディスク アドレスに変換したり、その逆に変換したりする関数が保持されています。

最初の 10 個は直接ポインターであり、11 ~ 13 個は間接ポインターです。

ブロック番号 5 を要求すると、それが直接ポインターになります。その値を読み取り、そのブロックからデータを読み取ります。

別の参照:http://erdos.csie.ncnu.edu.tw/~ccyang/Os2/Slides/chapter9.ppt

関連情報