2. 关于文件 (第一部分)

文件系统也是一个复杂的话题,这部分的内容是希望能勾勒出一个简单的模型,便于理解在alsa中碰到的文件相关的内容。

2.1 磁盘中的文件格式

linux本身支持的磁盘文件格式是ext2/ext4,ext4是ext2扩展而来的,增加了很多功能,但基本原理一致。单纯学习文件系统的代码的话,感觉从ext2开始是个不错的选择,代码量比ext4小很多。这里简单的了解一下ext2的结构:

 

                                        ext2 文件系统结构简图 

我们所说的磁盘格式化,其实就是按照一定的规则来设置磁盘。选择ext2系统的话,格式化后的磁盘,大致格式就如上图。

首先磁盘开头部分留给引导分区,而后可以将磁盘分成多个块组,块组内的格式一致,也是我们下面主要去了解的内容。

● super block

超级块。首先需要理解磁盘是以块为单位来处理数据的,也就是说块是磁盘处理的基本单位。比如说一个文件的大小不够写满一个块,剩下的空间去写另一个文件的内容是不允许的。超级块用来记录块的大小,文件系统类信(这里就是ext2),版本号等内容。

● Group Descriptor Table

组描述符表。记录该块组里的一些基本信息,比如inode表从哪儿开始,数据块从哪儿开始等等。

● Block Bitmap

 块位图。它用每个bit来表示一个块是否已经被使用。

● inode Bitmap

inode位图。与块位图作用类似,是用来标记inode是否已经被使用。

● inode Table

inode表。当保存一份文件的时候,除了文件本身的内容外。还需要保存文件名、创建时间、权限等内容,而这些内容就保存在inode中。inode还有一个重要作用就是记录文件内容保存在那些block中。每个文件已经目录都有自己对应的inode,而inode表就是所有这些inode存放的地方。

● Data Block

就是实际存储文件内容的地方了。

2.2 ​​​ 内存中文件格式

以上是文件在磁盘中的存储形式,加载到内存中的时候,也需要有对应的格式。另外为了支持众多的文件格式,内核提供了虚拟文件系统的概念。虚拟文件系统构建一些整体的操作流程,而将一些具体的实现通过函数指针的形式留给具体的文件系统去实现。看起来有点面向对象中继承的概念。

我们关注以下几个结构:

● super_block

其实它包含了磁盘系统中super block, Group Descriptor Table,Block Bitmap和 inode Bitmap的综合信息。

● inode

与磁盘中的inode节点功能一样,包含着文件的基本信息。好多文件操作都需要它的参与。

● dentry(directory entry)

在内存中,目录结构按照树形结构就行了组合。借助dentry结构来完成,看一下简图:

                      dentry 结构简图

从图上可见,每个目录和文件都对应一个dentry对象。 d_subdirs将所有的子目录链接起来,它指向的是d_child,list_head结构是双向链表。这份图并不完整,比如只画出了单链,没有包含.与..目录。每个对象中都包含一个d_inode,指向实际的inode节点。

● file

file也是只在内存中存在的对象,只有尝试打开文件的时候它才会生成。借助inode来完成文件的读写等操作。

以上是一些简单的介绍,有些内容可能并不完全准确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值