[文件与i节点的关系]
文件中的数据是放在磁盘上的数据区的,由一个个的数据块组成。对应文件此文件的i节点中会以某种方式存放保存有文件数据的这些逻辑块号。文件名与i节点对应。这样文件名就通过i节点与实际的文件的数据对应起来。在i节点中存放磁盘逻辑块号的字段是逻辑块号数组,也就是unsigned short i_zone[9]。i_zone[0]~i_zone[6]中直接存放对应的逻辑块号。当文件较大时,会需要使用i_zone[7]存放一次间接逻辑块号;而当文件再大一点,使用一次间接逻辑块号不足以保存时,就是用i_zone[8]存放二次间接逻辑块号。 有一个专门的函数(inode.c/_bmap)来处理文件数据块与磁盘逻辑块之间的映射。
i_zone[0]~i_zone[6]共能存储7个逻辑块号,也就是7K的文件大小。当文件小于7K时,只需要使用直接存储即可。
当文件大于7K时,使用i_zone[7],不过i_zone[7]对应的逻辑块中存放的不是文件数据,而是存储有文件数据的逻辑块号。也就是说,通过i_zone[7]找到逻辑块,然后通过这个逻辑块中的数据去得到真正存储有文件数据的逻辑块号。一个逻辑块大小是1K。也就是1024字节,一个逻辑块号用unsigned short表示,也就是需要2个直接。因此i_zone[7]对应的逻辑块中,存储放有512个逻辑块号,即i_zone[7]表示的文件大小是512K。因此,当文件大小在7k到7k+512K之间时,就需要用到i_zone[7]。
当文件再大一些时,就需要用到i_zone[8]。i_zone[8]中对应的逻辑块中存放有512个逻辑块号,这512个逻辑块中又分别存放有512个逻辑块号。通过二次间接,最后才得到真正存放文件数据的逻辑块号码。因此,i_zone[8]表示的文件大小是512×512K。所以,当文件大小在7K+512K~7K+512K+512*512K时,就需要用到i_zone[8]。当文件再大一点时,linux 0.11中就没法表示了。