Lions' 本読み (102)

V6 UNIX 沖縄セミナー第二弾も正式に開催決定ということで昨日の続きを。
ええと、継続な断点は

  • 5790 で呼び出されている maknode 手続きから呼び出されている ialloc 云々

ですね。以下なあたり。

5790            ip = maknode(u.u_arg[1]&07777&(~ISVTX));

ええと_スティッキービット (ISVTX) を明示的にリセットすることに注意してほしい_という記述がありますね。5790 でもそうしているのが分かります。ISVTX の定義は以下です。

5628 #define    ISVTX   01000

maknode という手続きは 408p の記述によれば _core (4105)、creat (5790)、mknod (5966) から呼び出される_とのこと。
とりあえず maknode 手続きを掘ってみます。

7455 maknode(mode)
7456 {
7457    register *ip;
7458
7459    ip = ialloc(u.u_pdir->i_dev);

ええと ialloc (7067) は手続き定義のコメントによれば以下。

指定されたデバイス上の未使用 i ノードを割り当てる。ファイル生成時に使用される。アルゴリズムはスーパブロック中に 100 個の予備の i ノードまでを保持する。これがなくなったら、i リストの線形サーチを始めて、さらに 100 個を確保する。


つーことは引数で渡されている u.u_pdir->i_dev はデバイスなソレなのか。u.u_pdir の定義は以下。

0435  int *u_pdir; /* dirp の親ディレクトリの i ノード */

ええと、配列の inode に i_dev という属性がありますね。

5663    int   i_dev;  /* i ノードが存在するデバイス */

む、記憶が定かではないのですが、デバイス、と呼ばれるオブジェクトに関する情報が無いな。int てことは_デバイス番号_なのかどうか。
む、ialloc 手続きにてこんなことしとるな。

7072    fp = getfs(dev);

ええと getfs は 7167 で定義されててコメントの一部が以下。

getfs はデバイス番号をコア中のスーパーブロックへのポインタにマップする。


ふむふむ。なるほど。とは言えよく分からん。スーパーブロックの定義を確認した方が良さげ、という判断にて探してみました。一部を以下に引用。

5561 struct filsys
5562 {
5563  int s_isize;      /* i リストのブロック単位のサイズ */
5564  int s_fsize;      /* 全ボリュームのブロック単位のサイズ */
5565  int s_nfree;      /* インコアフリーブロックの数
5566                       (0 から 100 の範囲) */
5567  int s_free[100];  /* インコアフリーブロック */
5568  int s_ninode;     /* インコア i ノード数 (0-100) */
5569  int s_inode[100]; /* インコアフリー i ノード */

時間切れ

ええと

  • ialloc 掘削
  • wdir 掘削

あたりが断点、ってことで。
ialloc から getfs および iget を呼び出してるんですがちょっとそれぞれの手続きが一体何をしているのか、が明確にイメージできてないですね。