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 を呼び出してるんですがちょっとそれぞれの手続きが一体何をしているのか、が明確にイメージできてないですね。