ディレクトリは、/usr/sys/h/dir.hで定義されているdirect構造体のリストです。
#ifndef DIRSIZ #define DIRSIZ 14 #endif struct direct { ino_t d_ino; char d_name[DIRSIZ]; };
direct構造体のサイズは16バイトで,、最初の2バイトはinode番号です。続く14バイトがファイル名です。
ルートディレクトリのファイルを見てみると、rl2tunixだとinode番号は0x007dだとわかります。i-node番号からディスクイメージでのアドレスへの変換は、次の式になります。
(inode番号 - 1)×dinod構造体のサイズ (64バイト)+ inodeブロックの先頭アドレス(0x400)
計算すると、rl2tunixのi-nodeのアドレスは0x2300になります。
di_addr[0]~di_addr[9]は直接参照で、ブロック番号0x000da5, 0x000da8, .... , 0x000dc0となっています。di_addr[10]は間接参照で、ブロック番号0x0dc3にブロック番号のリストがあります。こちらは3バイトではなく、4バイト単位でブロック番号が書き込まれています。
92ブロックの間接参照のブロック番号が書かれています。直接参照と合わせると、102ブロックに渡ってrl2unixが書き込まれていることがわかります。
これでUNIXカーネルのファイルまでたどり着くことができました。次は、ブートプログラムを見ていきます。
0 件のコメント:
コメントを投稿