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 章あたりから再読した方が良さげ。