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~511个bytes;第1块的内容为该文件的512~1023个bytes;
依次类推;
我们称这N块磁盘为“逻辑块”,对应的块号为逻辑块号。
即:文件的某offset所在的逻辑块号 = offset/512
bmap(ip, bn)用来将逻辑块号转化为实际的物理块号,它有两个参数:
(1)ip——指向该文件的inode;
(2)bn——逻辑块号。
函数返回值为实际的物理块号。
需要注意的是,bmap()的上层函数(即调用bmap的函数)有两种用途:
(1)“读”用途,即上层函数的目的是读取磁盘上的实际物理块;
(2)“写”用途,即上层函数的目的是将内存中的文件内容写入磁盘的实际物理块。
bmap()还提供了“副”功能来支持“写”用途,即当不存在实际物理块时,调用alloc分配之。
这很容易理解,比如新建的文件要写入磁盘,当然需要新分配;又或者文件变大了,以至于
需要新分物理块;bmap甚至还提供了代码,用于小文件变成了大文件的情形。
博客地址:http://blog.csdn.net/cszhao1980
博客专栏地址:http://blog.csdn.net/column/details/lions-unix.html