日期:2014-05-16  浏览次数:20821 次

(莱昂氏unix源代码分析导读-39)inode“资源”的获取和释放

                                              by cszhao1980

iget()函数用于获取inode资源,它有2个参数,设备号和inode id。前面说过,通过这两个参数

会唯一确定一个inode。简单的说,该函数的作用就是将指定的磁盘inode读入内存inode数组,

Lock该项(即会设置 ILOCK flag),它返回一个指向该inode数组项的指针。

 

事实上,iget()做的更多一些,它首先检查内存inode数组中,如果该inode项已经在其中,则直

Lock并返回。只有此inode尚未读入时,才需要从磁盘上读取。

 

莱昂对此函数的讲解比较详细,在这里我只说几点:

(1)    在读入该磁盘inode所在盘块时,使用如下语句:

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

1)   indoe块是从#2块开始的(#0UNIX忽略不用、“超级块”占据了磁盘的#1块);

2)   每个块可容纳16inode

 

(2)     在将磁盘inode内容复制给内存inode时,利用了二者自“i_mode”起layout相同的特点。

     因此,只需将指针指向磁盘inode头,逐个字节拷贝即可。如下所示:

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

7329:     ip2 = &p->i_mode;

7330:     while(ip2 < &p->i_addr[8])

7331:          *ip2++ = *ip1++;

 

3  它会增加该inode的引用计数(i_count)。这也正是main()函数两次调用它的原因,

       否则,在1618行,直接将rootdir赋值给u.u_cdir即可。