(莱昂氏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~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
- (莱昂氏unix源代码分析导读-38)文件物理存放位置与inode
- (莱昂氏unix源代码分析导读-37) 文件系统与inode
- (莱昂氏unix源代码分析导读-40)inode“指向文件的内容”的读写
- (莱昂氏unix源代码分析导读-45) 文件与“资源”
- (莱昂氏unix源代码分析导读-39)inode“资源”的获取和释放
- (莱昂氏unix源代码分析导读-5) 中断与陷入初探
- (莱昂氏unix源代码分析导读-25) signal(下)
- (莱昂氏unix源代码分析导读-22) trap函数(2693)
- (莱昂氏unix源代码分析导读-24)signal(上)
- (莱昂氏unix源代码分析导读-33) swap函数
- (莱昂氏unix源代码分析导读-36) 缓存管理(下)
- (莱昂氏unix源代码分析导读-1) 引子
- (莱昂氏unix源代码分析导读-26) trace
- (莱昂氏unix源代码分析导读-30) device
- (莱昂氏unix源代码分析导读-47) exec
- (莱昂氏unix源代码分析导读-18) 再谈中断与陷入
- (莱昂氏unix源代码分析导读-7) c语言若干问题
- (莱昂氏unix源代码分析导读-21)时钟中断处理
- 接口是否多此一举
- oracle savepoint介绍
- 在CentOS 5上安装Git
- 坦克大战0.8-1.4
- xp系统语言栏消失中英文切换
- (莱昂氏unix源代码分析导读-38)文件物理存放位置与inode
- HTTP 协议简介
- 教你获取并查看Android已安装应用程序的本地数据库信息(adb命令行与SQLite Manager插件的使用)
- Chapter 4 Trees and Graphs - 4.1
- 在uitabbarviewcontroller的子视图间相互访问,以及在uitabbarviewcontroller中访问其子视图
- Android中调用外部地图程序
- Chapter 4 Trees and Graphs - 4.2
- Effective C++ 类与函数的设计和申明
- C#文件操作