私は自分のオペレーティング システム用のファイル システムを作成しており、独自の設計を開始する前に既存のファイル システムについて調査しています。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