Lions' 本読み (134)

朝練メモ。へろへろです。

とりあえず

ino.h で定義されている struct inode が

5600 /* ディスク上に存在する
5601  * inode 構造体

で、スーパーブロックの次のブロック以降に直列に存在してる、という理解で良いのかどうか。添字は inode 番号。領域サイズは 32bytes で 1 ブロックあたり 16 個存在する計算になるのかどうか。
あと inode 番号が 16bit な int なので 64K 必要ってことは先頭の 32 block は inode な領域で占めてる、って理解で良いのかなぁ。
iget 手続きのこのあたりはそんなカンジ。

7319    ip = bread(dev, ldiv(ino+31, 16));

ここはブロックあたり 16 個存在して 2 番目以降のブロックに、という意図からで

7328    ip1 = ip->b_addr + 32*lrem(ino+31, 16);

ここはコピー元となる inode 番号のバッファの位置を ip1 が指すよう細工しているように見えます。

ialloc

どうもへろへろすぎで読めなかった模様。7096 から始まる繰り返しで_フリー inode_な配列に未使用 inode を割り当てているのが読めた。ここでもやはり

7096    for(i=0; i<fp->s_isize; i++) {
7097            bp = bread(dev, i+2);
7098            ip = bp->b_addr;
7099            for(j=0; j<256; j=+16) 

というあたりで 2 番目のブロック以降が inode 配列なブロックで、バッファには 32byte 毎 16 個の要素が、ということが分かります。

つうか

テキストに凄く書き込まれてるんですがここまで忘却の彼方だと見事に過ぎるな。

ちなみに

昨日朝行方不明になった部分ですが

7328    ip1 = ip->b_addr + 32*lrem(ino+31, 16);

ここでバッファの inode 番号な該当位置をポイントして

7329    ip2 = &p->i_mode

ここはインコア inode な配列の空きを p が指しててその_とある要素_のアドレスをポイントしてます。インコアなソレとディスクなナニについては

5607    int  i_mode;
5608    char i_nlink;
5609    char i_uid;
5610    char i_gid;
5611    char i_size0;
5612    char *i_size1;
5613    int i_addr[8];

な部分の要素がカブってる形になってまして (上のはディスク inode の例)、i_mode な属性から始める形で

7330    while(ip2 < &p->i_addr[8])
7331            *ip2++ = *ip1++;

としてあげればカブッてる属性のコピィができる、という事になりますね。
ちょっとテキスト本文読みきれていないような気がするのでちゃんと読む。