(莱昂氏unix源代码分析导读-38)文件物理存放位置与inode

来源:互联网 发布:moto2008概预算软件 编辑:程序博客网 时间:2024/04/28 13:08

                                 by cszhao1980

文件的物理位置指文件存放:

1)哪个设备;

2)该设备的哪些块。

 

Inode使用i_addr[8]数组来记录文件的物理块号:

1)对“小文件”(占用的块数<=8块),i_addr数组内直接存放文件占用的物理块号;

     如文件占用6块,则使用i_addr[0] ~ i_addr[5]存放这6个块号

 

2)当文件占用的块数超过8块(此时,i_mode需要置大文件标志“ILARG”),

     则这样处理

     1)前7个块(i_addr[0] ~ i_addr[6]存放的块号)为indirect block,即块内的每个word

          用来存放真实的块号——可支持256*7 = 1792块;

 

     2 i_addr[7]double indirect block——可支持256*256 = 65535个块(2**16

 

介绍一下“逻辑块”的概念:

1)如某文件大小为x字节,则其需要占据的块数是(x+511)/512 = N

2)我们假定磁盘有连续的N块分给该文件,其块号为0 ~ N-1

3)则第0块的内容为该文件的第0~511bytes;第1块的内容为该文件的512~1023bytes

依次类推;

我们称这N块磁盘为“逻辑块”,对应的块号为逻辑块号。

即:文件的某offset所在的逻辑块号 = offset/512

 

bmap(ip, bn)用来将逻辑块号转化为实际的物理块号,它有两个参数:

1ip——指向该文件的inode

2bn——逻辑块号。

函数返回值为实际的物理块号。

 

需要注意的是,bmap()的上层函数(即调用bmap的函数)有两种用途:

1)“读”用途,即上层函数的目的是读取磁盘上的实际物理块;

2)“写”用途,即上层函数的目的是将内存中的文件内容写入磁盘的实际物理块。

 

bmap()还提供了“副”功能来支持“写”用途,即当不存在实际物理块时,调用alloc分配之。

这很容易理解,比如新建的文件要写入磁盘,当然需要新分配;又或者文件变大了,以至于

需要新分物理块;bmap甚至还提供了代码,用于小文件变成了大文件的情形。

 

博客地址:http://blog.csdn.net/cszhao1980

博客专栏地址:http://blog.csdn.net/column/details/lions-unix.html

 

原创粉丝点击