日期:2014-05-16 浏览次数:20839 次
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块开始的(#0块UNIX忽略不用、“超级块”占据了磁盘的#1块);
2) 每个块可容纳16个inode
(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即可。