linux文件系统基于虚拟文件系统VFS构建了一个灵活的框架,能够使现有的文件系统类型都能够在其下运行。
最近在研究Linux内核中文件系统部分的实现,把其中自己的感悟和大家分享一下。
理解文件系统的关键在于理解核心数据结构,在Linux内核中关键的数据结构包括以下几个。
1、super_block:超级块。超级块中记录了文件系统主要的信息,每一类文件系统对于一个超级块,多个文件系统的实例公用一个超级块。超级块同时存在两个映像,内存中的超级块映像为了加速查询和更新出来,而硬盘中的超级块则用于固化存储。在启动或者加载文件系统的时候,内核被硬盘中的超级块加载到内存中。
2、inode:每个文件都对应一个inode。同超级块一样,inode也同时在内存和硬盘中存在两份映像,inode被分成不同的类,从属不同的链表。每个inode只是存在于两个链表中,一个是哈希表,用于加速查询过程,另一个是分类表,例如脏的inode链表。
3、dentry:目录项缓存。与上述两种对象不同,目录项缓存只存在于内存中,在硬盘等存储介质中没有对应的对象,所以,对于一个dentry对象不会有脏标志位。因为它不会同步数据,目录项缓存的作用就是加速路径的解析速度。
4、file:文件对象。文件对象的概念只是相对于进程而言。文件在介质上也没有对应的对象,所以文件也没有脏标志位,所以存在多有文件对象对应一个inode的情况。