Lions' 本読み (105)
ええと、何故に i-node を 100 個、というあたりが謎だったのですが、スーパーブロックに (creat 時に払いだす等の用途として) 100 個未満 (じゃないや、以下か) の予備 i-node のプールを持っているんですね。成程。
つうか、以下な記述が微妙に不思議。
7103 for(k=0; k<NINODE; k++) 7104 if(dev == inode[k].i_dev && 7105 ino == inode[k].i_number) 7106 goto cont;
NINODE の値は 100 で、inode という配列の要素数も 100 (NINODE) なんですが、システム全体でその程度ありゃ何とかなってたのか。
あと、やっぱ上記の前な記述が微妙。
7096 for(i=0; i<fp->s_isize; i++) { 7097 bp = bread(dev, i+2);
ええと、fp は引数で渡されてきたデバイス番号をスーパーブロックのポインタに変換したナニです。む、struct filsys の定義なコメントに
スーパーブロックはそれぞれの mount(smount/sys3.c) で割り当てられて読み込まれ、umount(sumount/sys3.c) で解放される。
という記述を発見。当り前の話ですが成程、と得心。おそらくは s_isize 属性も mount 時あたりに値が設定されるのだろうと類推してますがそのあたりはちょっとスルーで。
問題にしたいのは 7097 行の bread でして、ブロック #2 以降を順に読み出してる形になるのか。
ちなみに bread 手続きですが 4754 で定義されてて
4754 bread(dev, blkno) 4755 { 4756 register struct buf *rbp; 4757 4758 rbp = getblk(dev, blkno);
最終的にこの rbp が戻されてます。getblk 手続き定義なコメントを確認してなんとなくイメージできて気がしてます。
指定のブロックに対するバッファを割り当てる。
ええと、mount されたファイルシステムなソレについては全てのブロックに対してバッファなオブジェクトが割り当てられているのだろうか。
つーことは直前エントリで b_addr 属性には buffers なソレが云々と書いてるんですが、これはダウトなのかどうか。つうか、buf という配列が何なのかを理解できてないのか。これは痛いな。
で、b_addr で xref を手繰ってたら smount (6086) で以下な記述を発見。
6123 smp->m_bufp = getblk(NODEV); 6124 bcopy(mp->b_addr, smp->m_bufp->b_addr, 256);
なる記述を発見。おそらくこれは mount 時に領域確保してます、な記述に違いない、のかどうなのか。あるいは getfs (7167) での以下な記述
7174 p = p->m_bufp->b_addr; 7175 n1 = p->s_nfree; 7176 n2 = p->s_ninode;
b_addr 属性に格納されているのはスーパーブロックな構造体オブジェクトのアドレス?
これは上記な部分の次のページの unix/alloc.c の Page 7 でも同様な記述がありますね。うーん。。。
とは言え、ialloc 手続きでは i+2 なバッファヘッダを取得して
7097 bp = bread(dev, i+2); 7098 ip = bp->b_addr; 7099 for(j=0; j<256; J=+16) { 7100 ino++; 7101 if(ip[j] != 0) 7102 continue;
b_addr 属性なアドレスが register * な ip に代入されてるんですが、ip[j] て何だろ。これはあまりにも謎すぎる。
なんとなくこの ialloc がしてることが 417p に記述されている i-node なリスト云々なソレと合致していることは理解できてるんですが、上に引用した 7099-7102 なナニがイメージできない。
何故か smount (6086) で b_addr なソレに struct filsys なスーパーブロックが云々されている記述もあるように見えるんですがもうワケワカ。
やはり
どこかに書いた通り、15 章あたりから再読した方が良さげ。