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