文件系统也是一个复杂的话题,这部分的内容是希望能勾勒出一个简单的模型,便于理解在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来完成文件的读写等操作。
以上是一些简单的介绍,有些内容可能并不完全准确。