ファイルシステム: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配列。次に存在するデータにデータブロック

これ索引ノードのリスト固定サイズです。

構造スーパーブロックディスクから:

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

lib.cソースルートディレクトリのファイル(restor上記参照)には、longを3バイトのディスクアドレスに変換するか、その逆に変換する機能が含まれています。

最初の10個は直接ポインタで、11〜13個は間接ポインタです。

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

もう一つの参考資料:http://erdos.csie.ncnu.edu.tw/~ccyang/Os2/Slides/chapter9.ppt

おすすめ記事