linux内核注释v0.11-超级块、inode索引节点和磁盘块(逻辑块)

       linux中所有的设备都被看作是文件,文件属性和数据是分别存储管理的,其中数据散布在逻辑块中,而文件的属性则保存在成为inode的索引节点的数据结构中,索引节点以静态形式存在于磁盘上,其形式为struct d_inode ,当内核需要操作索引节点时,会把其对到内存的索引节点struct m_inode 数据结构中。文件的内容改变时需要将内容写到磁盘上,而改变文件内容、改变文件所有者、文件存取权限等时都要将内存中索引节点的内容更新到磁盘上。磁盘索引节点以数组的形式存储,是在内核格式化文件系统时设定的,而内存索引节点的管理方式与高速缓冲区的管理类似,都是通过哈希队列和空闲列表管理的。所以对索引节点的读写与高速缓冲的读写策略是相似的,唯一需要做的就是根据索引 节点号计算出磁盘逻辑块号,公式如下:

       逻辑块号 = (启动块 + 超级块)+ i节点位图占用的块数 + 逻辑块位图占用的块数 + (i节点号 - 1)/ 每块含有的i节点数

       block = 2 + sb->s_imap_blocks + sb->s_zmap_blocks + (inode->i_num - 1)/INODES_PER_BLOCK    (sb为超级块数据结构)

       这样有了设备号(m_inode中有此字段)和逻辑块号就可以从磁盘读索引节点的数据,拷贝到内核分配的内核索引节点中,并返回这个的索引节点。

       文件中的数据是不保存在索引节点中的,但有了索引节点就可以很容易的定位到保存数据的所有逻辑块的位置。

       日常操作中,我们是不跟inode直接打交道的,我们操作文件都是直接根据文件名来定位文件,但对于内核来说,inode对它才更显的有实际意义,于是,就需要有一种途径来将我们更习惯的文件名转换为内核更熟悉的inode,这时目录起到了桥梁的作用。本质上,目录也是文件,也需要内核分配inode和block来存储属性和数据。目录的数据为包含在这个目录中的文件名,于是乎,当我们给内核一个文件名的完整路径,内核通过分析这个路径的各个分量从而转换为输入路径名对应的索引节点。有了inode后内核就能够对文件的数据进行各种操作了。

       所以说文件其实只与所在的目录直接关联,所以说如果你需要区执行一个可执行文件,即使你对这个文件有执行的权限,但你对所在文件的目录没有写权限你同样不能够完成执行的操作。

       说了细节后再谈谈内核是如何分配索引节点和磁盘的。linux下通过调用mkfs来格式化一个文件系统,如下所示:

      

       超级块中记录着文件系统的各个具体信息,i节点位图说明i节点的是否被使用,逻辑块位图用于描述盘上的每个数据块的使用情况,i节点部分存放着文件的索引节点,磁盘块存放文件的数据。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值