打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
《LINUX内核源代码情景分析》——文件系统(2) - 月静水 - 博客大巴
 

1.2.5.2文件类型

1.2.5.2.1磁盘文件

“文件”包含两方面的信息:一是存储的数据本身;还有一部分就是有关该文件的组织和管理的信息。对于磁盘文件来说,这两种信息必定全部存储在“文件系统”中,也就是磁盘上。其中与组织和管理有关的信息主要存储在文件的“索引节点”和“目录项”中。

在磁盘上,既是文件没有数据,其索引节点也总是存在的;目录节电存在于所谓“目录节点”中,目录节点实际上是一种特殊形式和用途的文件。

1.2.5.2.2设备文件

设备文件同样包含有用于组织和管理的信息,同样有存储介质上的索引节点和目录项,但是却不一定有存储着的数据。

根据设备类型和性质的不同,它可以是用于存储/读出的(如磁盘),也可以是用于接收/发送的(如网络卡)、还可以是供才基/控制的(如一些机电设备),甚至可以是数种类型的结合。

实际上,不管什么设备,在操作的过程中总要伴随着一定程度的数据采集和控制,通常都通过设备接口上的一个“控制/状态寄存器”进行。

1.2.5.2.3特殊文件

特殊文件在内存中也由inode数据结构和dentry数据结构,但是不一定在存储介质上有索引节点和目录项。与前两种文件主要的不同是:特殊文件一般都与外部设备无关,所涉及的介质通常就是内存以及CPU本身。当从一特殊文件“读”时,所读出的数据都是由系统内部按一定的规则临时声称出来的,或者从内存中收集、加工出来的,反之亦然。

三种不同类型的文件有一个共同点,那就是他们都有一些关于组织和管理的信息。因此,每个文件都有一个inode。所谓inode,也就是“索引节点”(或称“i节点”)的意思。给出一个索引节点号,就可以通过磁盘的设备驱动程序将其所在的纪录块赌如内存中。(各项的详解在书上第424页)。

struct inode {

        ……

};

linux本身的文件系统ext2而言,就是ext2_inode数据结构。

struct ext2_inode {

        ……

};

1.2.5.3目录

1.2.5.3.1目录树

根据一个文件的文件名就可以在磁盘上找到该文件的索引节点,从而在内存中建立起代表该文件的inode结构,这种机制就是文件系统的目录树。这颗倒立的“树”从系统的“根节点”,即“/”开始向下伸展,除最底层的“叶”节电“文件”外,其他的中间节电都是“目录”。目录是一种特殊的磁盘文件,它的“文件名”就是目录名,也有索引节点,并且有数据部分。不同的是,数据部分的内容只包括“目录项”。对ext2文件系统来说,“目录项”即ext2_dir_entry_2数据结构。

struct ext2_dir_entry_2 {

        ……

};

正如磁盘上的ext2_inode数据结构在内存中的对应物为inode结构一样,目录项ext2_dir_entry_2在内存中的对应物是dentry结构,但是这二者也有很大的不同。

struct dentry {

        ……

};

1.2.5.3.2超级块

每一个“文件系统”,即每一个格式化成某种文件系统的存储设备上都有一个根目录,同时又都有一个“超级块”(super block),根目录的位置以及文件系统的其他一些参数就记录在超级块中。超级块在设备上的逻辑位置都是固定的,例如,在磁盘上总是在第二个逻辑块(第一个逻辑块位引导块),所以不需要再从其他什么地方去“查找”。同时,对于一个特定的文件系统,超级块的格式也是固定的,系统在初始化时要将一个存储设备(通常就是从引导出操作系统的那个设备)作为整个系统的“根设备”,它的根目录就成为整个文件系统的“总根”,就是“/”。更确切地说,就是把根设备的根目录“安装”在文件系统的总根“/”结点上。有了根设备以后,还可以进而把其他存储设备也安装到文件系统中空闲的目录节点上。所谓“安装”,就是从一个存储设备上读入超级块,在内存中建立起一个super_block结构。再进而将此设备上的根目录与文件系统中已经存在的一个空白目录挂上钩。系统初始化是整个文件系统只有一个空白目录“/”,所以根设备的根目录就安装在这个节点上。这样,从根目录“/”开始,根据给定的“全路径名”就可以找到文件系统中的任何一个文件,而不论这个文件是在哪一个存储设备上,只要文件所在的存储设备已经安装就行了。

系统提供了从“当前目录”开始查找的手段。每一个进程在每一时刻都有一个“当前工作目录pwd”,用户可以改变这个目录,但是永远都有这么个目录存在。

1.2.5.3.3文件系统存储形式

对于普通文件,文件系统层最终要通过磁盘或其他存储设备的驱动程序从存储介质上读或页。就ext2文件系统而言,从磁盘文件的角度来看,对存储介质的访问可以涉及到四种不同的目标,那就是:1)文件中的数据,包括目录的内容,即目录项ext2_dir_entry_2数据结构;2)文件的组织与管理信息,即索引节点ext2_inode数据结构;3)磁盘的超级块。如果武力的磁盘被划分成若干个分区,那就包括每个“逻辑磁盘”的超级块;4)引导块。

引导块

超级块

索引节点部分,大小取决于格式化参数

数据部分,大小取决于格式化参数和磁盘大小

 

 1.2.6数据结构总结

实际上,具体文件系统与虚拟文件系统VFS间的界面是一组数据结构,包括:

1)文件操作跳转标,即file_operation数据结构:file结构中的指针f_op指向具体的file_operations结构,这是read()write()等文件操作的跳转表。一种文件系统并不只限于一个file_operations结构,如ext2就有两个这样的数据结构,分别用于普通文件和目录文件。

2)目录项操作跳转表,即dentry_operations数据结构:dentry结构中的指针d_op指向具体的dentry_operations数据结构,这是内何种hash()compare()等内部操作得跳转表。如果d_op0则表示按linux默认的(即ext2)方式办。注意,这里说的目录项,而不是目录,目录本身是一种特殊用途和具有特殊结构的文件。

3)索引节点操作跳转表,即inode_operations数据结构:inode结构中的指针i_op指向具体的inode_operations数据结构,这是mkdir()mknod()等文件操作以及lockup()_permission()等内部函数的跳转表。同样,一种文件系统也并不只限于一个fle_operations结构。

4)超级块操作跳转表,即super_operations数据结构:<span lang="EN-US" style="FONT-S

2. 从路径名到目标节点

Dentry简要地总结(代码在1.2.5.3.1


--每个dentry结构都通过队列头d_hash链入杂凑表dentry_hashtable中的某个队列里。

--共享计数为0dentry结构都通过队列头d_lru链入LRU队列dentry_unused,在队列中等待释放或者“东山再起”。

--每个dentry结构都通过指针d_inode指向一个inode数据结构。但是多个dentry结构可以指向同一个inode数据结构。

--指向同一个inode数据结构的dentry结构都通过队列头d_alias连接在一起,都在该inode结构的i_dentry队列中。

--每个dentry结构都通过指针d_sb指向一个super_block数据结构。

--每个dentry结构都通过指针d_op指向一个dentry_operation数据结构。

--每个dentry结构都有个队列头d_vfsmnt,用于文件系统的安装。

_usr_walk为例,走一下它的流程。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
从文件 I/O 看 Linux 的虚拟文件系统
linux文件系统之总结
VFS及LINUX中文件系统
【转】Linux那些事儿之我是Sysfs(7)dentry与inode - wilson的...
理解linux虚拟文件系统VFS
Linux 文件系统(一)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服