ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

《Linux内核设计的艺术》——第5章 文件系统

2022-08-19 11:30:58  阅读:148  来源: 互联网

标签:文件 同步 数据 Linux 文件系统 内核 3.1 缓冲区 inode


1. 挂载文件系统

当前系统已经完成了根文件系统的挂载,将要挂载新的文件系统。
新的文件系统挂载在根文件系统的某个目录的inode上。
1)将硬盘的超级块读出,载入系统的super_block[8]中
2)从根文件系统读出指定的inode,载入inode_table[32]
3)将硬盘的超级块挂接到inode_table[32]中指定的i节点上。

在shell中输入 mount /dev/hd1 /mnt命令来安装文件系统。
注意硬盘可以分区,每个分区算一个设备 /dev/hd1 就是一个设备。



挂接部分详解

2. 示例展示1

展示单进程打开并读取文件,文件系统的工作原理

2.1 打开文件

1)将用户进程task_struct的 *filp[20] 与内核的 file_table[64]挂接
2)将用户进程需要打开的文件对应的inode在file_table[64]中进行登记

打开过程分三步:
1)将用户进程task_struct的 *filp[20] 与内核的 file_table[64]挂接
2)用给定路径名 /mnt/user/user1/user2/hello.txt 为线索,找到hello.txt文件的inode
3)将inode在file_table[64]中进行登记

2.1.1 分配fd和file_struct


2.1.2 获取inode

文件路径名:/mnt/user/user1/user2/hello.txt
解析方法

2.1.2.1 获得枝梢目录的inode




所以 get_dir 会多次调用 iget和 find_entry ,以此获得 mnt,user,user1,user2的 inode,最终获得枝梢文件user2的inode,并返回

2.1.2.2 获得目标文件的inode

2.1.2 将inode和 file_struct 挂接

2.2 读文件

2.2.1 确定数据块在外设的位置

下面介绍inode如何管理文件
inode通过他的 i_zone 结构来管理文件数据块,


2.2.2 将数据块读入缓冲块

2.2.3 将缓冲区数据复制到进程空间

3. 示例展示2——新建文件,并写文件

3.1 sys_creat

3.1.1 找目录项是否存在

3.1.2 新建目录项



create标志置位,不等于就要创建一个新数据块,必须确保文件的下一个文件块不存在,即!inode->i_zone[……]或!i成立,才能创建新
数据块。比如本实例中加载目录项的内容,一个数据块中没有发现空闲项,很可能下一个数据块中就有,如果强行分配新数据块,就会把已有的块覆盖掉,导致目录
文件管理混乱。

3.1.3 写文件

操作系统对写文件操作的规定是:进程空间的数据先要写入缓冲区中,然后操作系统在适当的条件下,将缓冲区中的数据同步到外设上。而且,操作系统只能以数据
块(1 KB)为单位,将缓冲区中的缓冲块(1
KB)的数据同步到外设上。这就需要在同步之前,缓冲块与外设上要写入的逻辑块进行一对一绑定,确定外设上的写入位置,以此保证用户空间写入缓冲块的数
据,能够准确地同步到指定逻辑块中。

3.1.3.1 确定写的位置


3.1.3.2 申请缓存块

3.1.3.3 将数据复制到缓冲块

此时,用户进程指定的数据,只是写入缓冲区中,并未写入硬盘。下面介绍数据从缓冲区同步到硬盘的方式。

3.1.4 数据同步到外设

数据从缓冲区同步到硬盘有两种方法。一种是updata定期同步;另一种是因缓冲区使用达到极限,操作系统强行同步。

3.1.4.1 update同步

由shell启动的update进程,该进程会调用pause()函数,这个函数会映射到sys_pause()函数中,使该进程被设置为可中断等待状态。每隔一段时间,操作系统就将updata进程唤醒。它执行后,调用sync()函数,将缓冲区中的数据同步到外设上。

sync()函数最终映射到sys_sync()系统调用函数去执行。为了保证文件内容同步的完整性,需要将文件i节点位图、文件i节点、文件数据块、数
据块对应的逻辑块位图,全都同步到外设。sys_sync()函数先将改动过的文件i节点写入缓冲区(其余内容已经在缓冲区中了),之后,遍历整个缓冲
区,只要发现其中缓冲块内容被改动过(b_dirt被置1),就全部同步到外设上。

同步inode

3.1.4.2 缓冲区满同步

当要写的数据缓冲区已经装不下,则需要同步缓冲区中的旧数据。

3.1.5 修改文件

修改文件就是在文件任意位置插入,删除数据,且不影响文件已有数据。

3.1.5.1 重定位文件当前指针

假设已有文件 hello.txt,内容为 hello 这下面程序能将文件改为 hello,Liuxword

3.1.6 关闭文件

释放inode

3.1.7 删除文件





标签:文件,同步,数据,Linux,文件系统,内核,3.1,缓冲区,inode
来源: https://www.cnblogs.com/yangxinrui/p/16599828.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有