首页 > 系统相关 >《Linux内核设计的艺术》——第5章 文件系统

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

时间:2022-08-19 11:37:16浏览次数:64  
标签:文件 同步 数据 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
From: https://www.cnblogs.com/yangxinrui/p/16599828.html

相关文章

  • Function Interposition in Linux(hook)
    你是否想多改变库代码的工作方式,不替换整个库或者重新编译它。例如,你想包裹一层malloc和free函数来记录分配的日志,为了查找内存泄露。你可以重写那段使用了malloc/free的代......
  • Linux命令----常用的内置命令
    前言linux操作系统提供了一些内置的命令,掌握这些有利于我们日常对linux的使用,以及shell脚本的开发维护。下面简单了解几个常用的内置命令help:用来查看linux中其他命令......
  • Linux安装Jenkins超详细全过程
    文章转载自https://www.jb51.net/article/230962.htm目录1.安装JDK2.安装Jenkins3.修改Jenkins配置4.启动Jenkins5.服务器开放端口,打开浏览器访问6.获取管理员密码7.自定......
  • linux安装tomcat
     一、准备1、tomcat下载tomcat下载,地址:https://tomcat.apache.org/download-80.cgi    2、linux服务器(CentOs) 3、java环境 (1)下载jdk包,把包移动到/opt/s......
  • linux零基础预科自己的记录
     1.脚本:一系列的shell命令组成的程序叫做脚本。2.linux文件的类型 文件夹:  d普通文件:-r连接文件:l 3.在linux的控制台上如何使用后man命令如何退出 进入后......
  • Linux操作系统学习
    Linux一切皆文件,最高权限的账户root。1、开机登录开机会启动很多进程,在Windows上叫“服务”(service),在Linux上叫做“守护进程”(daemon)登录方式:命令行登录ssh登录......
  • Linux学习笔记
    1、Linux简介:一种开源的、免费的操作系统,安装在计算机硬件上、用来管理计算机的硬件和软件资源的系统软件。  Linux注重安全性、稳定性、高并发处理能力,但......
  • RedHat7 关闭防火墙及SElinux
    转载:RedHat7关闭防火墙及SElinuxRedHat7.x默认不再用iptables管理防火墙,相关命令如下:一、关闭防火墙1.查看防火墙状态systemctlstatusfirewalld2.实时关闭(重启恢......
  • linux之htop命令
      参考文档:https://www.jianshu.com/p/32112b3776e3 ......
  • linux下无法进入外加移动硬盘文件夹 No such file or directory
    (36条消息)linux下无法进入文件夹Nosuchfileordirectory_Katzelala的博客-CSDN博客_linux无法进入文件夹用Ubuntu系统遇到的一个小错误我们要进入一个文件夹,使用......