cmake读取配置文件操作 虚拟文件系统的作用( 二 )


目录树
综合来说 , Linux 的 根文件系统(system’s root filessystem) 是内核启动mount的第一个文件系统 。内核代码映像文件保存在根文件系统中 , 而系统引导启动程序会在根文件系统挂载之后 , 从中把一些基本的初始化脚本和服务等加载到内存中去运行(文件系统和内核是完全独立的两个部分) 。其他文件系统 , 则后续通过脚本或命令作为子文件系统安装在已安装文件系统的目录上 , 最终形成整个目录树 。
start_kernelvfs_caches_initmnt_initinit_rootfs // 注册rootfs文件系统init_mount_tree // 挂载rootfs文件系统…rest_initkernel_thread(kernel_init, NULL, CLONE_FS);
就单个文件系统而言 , 在文件系统安装时 , 创建超级块对象;沿树查找文件时 , 总是首先从初识目录的中查找匹配的目录项 , 以便获取相应的索引节点 , 然后读取索引节点的目录文件 , 转化为dentry对象 , 再检查匹配的目录项 , 反复执行以上过程 , 直至找到对应的文件的索引节点 , 并创建索引节点对象 。
软链接 vs 硬链接
软链接是一个普通的文件 , 其中存放的是另外一个文件的路径名 。硬链接则指向同一个索引节点 , 硬链接数记录在索引节点对象的i_nlink字段 。当i_nlink字段为零时 , 说明没有硬链接指向该文件 。
文件 & 进程管理
下图是一个简单示例 , 说明进程是怎样与文件进行交互 。三个不同进程打开同一个文件 , 每个进程都有自己的文件对象 , 其中两个进程使用同一个硬链接(每个硬链接对应一个目录对象) , 两个目录项对象都指向同一个 索引节点对象 。
索引节点的数据又由两部分组成:内存数据和磁盘数据 。Linux 使用Write back作为索引节点的数据一致性策略 。对于索引节点的数据 , 当文件被打开时 , 才会加载索引节点到内存;当不再被进程使用 , 则从内存踢出;如果中间有更新 , 则需要把数据写回磁盘 。
* “in_use” – valid inode, i_count > 0, i_nlink > 0* “dirty” – as “in_use” but also dirty* “unused” – valid inode, i_count = 0
索引节点是否仍在使用 , 是通过open()和close()操作建立和销毁文件对象 , 文件对象通过索引节点提供的iget和iput更新索引节点的i_count字段 , 以完成使用计数 。open 操作使得 i_count 加一 ,  close 操作使得 i_count 减一 。在 close 操作时判断索引节点是否释放 , 如果 i_count = 0 , 则意味着不再有进程引用 , 将会从内存释放 。
文件 & 磁盘管理
文件与磁盘管理联系最紧密的操作 , 莫过于touch和rm操作 , 而尤以后者最为关键 。通过strace(或 dtruss) , 查看rm的实际的系统调用 。
# dtruss rm tmp…geteuid(0x0, 0x0, 0x0) = 0 0ioctl(0x0, 0x4004667A, 0x7FFEE06F09C4) = 0 0lstat64(“tmp”, 0x7FFEE06F0968, 0x0) = 0 0access(“tmp”, 0x2, 0x0) = 0 0unlink(“tmp”, 0x0, 0x0) = 0 0
可以发现rm实际是通过unlink完成的 。unlink代表删除目录项 , 以及减少其索引节点的计数 。由通用文件模型可知 , 父目录本身同样是一个文件 , 也就意味着目录项是其文件数据的一部分 。删除目录项等价于从父目录的文件中删除数据 , 也就意味着首先要打开父目录的文件 。那么 , 删除操作即可理解为:


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: