44 ext4 文件系统

前言

在 linux 中常见的文件系统 有很多, 如下 

基于磁盘的文件系统, ext2, ext3, ext4, xfs, btrfs, jfs, ntfs 
内存文件系统, procfs, sysfs, tmpfs, squashfs, debugfs 
闪存文件系统, ubifs, jffs2, yaffs  

文件系统这一套体系在 linux 有一层 vfs 抽象, 用户程序不用关心 底层文件系统的具体实现, 用户只用操作 open/read/write/ioctl/close 的相关 系统调用, 这一层系统调用 会操作 vfs 来处理响应的业务 

vfs 会有上面各种文件系统对应的 读写 相关服务, 进而 将操作下沉到 具体的文件系统 

我们这里看一下 ext4 文件系统 

将业务数据存储在磁盘的一个文件系统, 读写数据 最终会提交到磁盘设备 

将数据暂存在内存中物理页, 动态刷出到磁盘 

如何分配inode ?

在创建该文件的时候, ext4fs 会创建对应的 inode, 并将改 inode 添加到 父级节点

创建 inode 操作来自于, 父级目录的 i_op->create, ext4fs中对应于 ext4_create

这里主要是基于 ext4fs 的 super_block 新建 inode, 初始化 i_no, i_mapping, i_op, i_fop 什么的 

接下来是 查找 group, 分配文件节点, 这里可以看得出来 ext4 文件系统对于 文件数量的限定是一个 逻辑上的限定

接下来是初始化 inode/ext4_inode 的相关其他信息

普通文件的 i_fop 为 ext4_file_operations

另外就是创建了文件之后, 还需要将文件的相关信息 添加到文件夹中记录

这里 ext4_find_dest_de 会找到 父文件夹的数据内容中存放当前文件的地址, 如果有则找到 已有的文件的地址, 如果没有在父文件夹的数据内容末尾 记录当前新增文件的信息

这里 就是设置文件夹中 新增/更新文件元数据的地方

这里记录几个信息项 inode, rec_len, name_len, file_type, name  

查看 /jerry 的文件夹的内容, buffered_head

0xffff88007dc08630:     29 '\035'       0 '\000'        0 '\000'        0 '\000'        36 '$'  0 '\000'        26 '\032'       1 '\001'
0xffff88007dc08638:     84 'T'  101 'e' 115 's' 116 't' 49 '1'  51 '3'  83 'S'  105 'i'
0xffff88007dc08640:     103 'g' 110 'n' 97 'a'  108 'l' 80 'P'  97 'a'  114 'r' 101 'e'
0xffff88007dc08648:     110 'n' 116 't' 65 'A'  110 'n' 100 'd' 67 'C'  104 'h' 105 'i'
0xffff88007dc08650:     108 'l' 100 'd' 0 '\000'        0 '\000'        30 '\036'       0 '\000'        0 '\000'        0 '\000'
0xffff88007dc08658:     36 '$'  0 '\000'        28 '\034'       1 '\001'        84 'T'  101 'e' 115 's' 116 't'
0xffff88007dc08660:     49 '1'  51 '3'  83 'S'  105 'i' 103 'g' 110 'n' 97 'a'  108 'l'
0xffff88007dc08668:     80 'P'  97 'a'  114 'r' 101 'e' 110 'n' 116 't' 65 'A'  110 'n'
0xffff88007dc08670:     100 'd' 67 'C'  104 'h' 105 'i' 108 'l' 100 'd' 46 '.'  99 'c'
0xffff88007dc08678:     31 '\037'       0 '\000'        0 '\000'        0 '\000'        -120 '\210'     1 '\001'        5 '\005'        1 '\001'
0xffff88007dc08680:     50 '2'  46 '.'  116 't' 120 'x' 116 't' 0 '\000'        0 '\000'        0 '\000'
0xffff88007dc08688:     0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'# 这里内存中的 0xffff88007dc08678 开始 为 /jerry 目录下面 我们新增的 2.txt 的数据条目 
inode_no 为 0x00 00 00 1f 
rec_len 为 0x01 88
name_len 为 0x05 
file_type 为 0x01 
name 为 2.txt 

/jerry/xx 是在哪里创建的 ?  

这个创建取决于实际的业务, 业务/内核 代码向 ext4fs 中写出具体的数据到具体的文件 

那么执行 该代码的时候 就会创建对应的文件

如何分配存储空间 ? 

存储空间是来自于 pagecache, 然后 具体的数据是来自于 磁盘设备 

  从磁盘读取数据到内存的调试 

如何读写数据 ?

a_ops->write_begin 会获取 maping, pos 对应的物理页, 如果不存在 则向 pagecache 进行申请 

然后 iov_iter_copy_from_user_atomic 的实现是将 用户空间待写出的数据 写出到给定的 物理页, 然后 系统会定时将脏页刷出到磁盘

读取文件的时候 根据 mapping, index 获取磁盘文件块, 加载到 page 

这一部分的内容参见 从磁盘读取数据到内存的调试 

 copy_page_to_iter 即为读取的操作, 将物理页的数据拷贝到 buf 中

如何根据 path 获取到上下文的数据? 

上面在 i_op->create 中创建了 inode, 但是并没有提到将 inode 注册到 dir 中或者怎么怎么样 

那么 读取文件的时候怎么关联找到这个 inode 呢? 

然后 之后才是走的上面的 i_op->lookup 在父目录的内容中查找 目标文件的条目[ext4_dir_entry_2], 这里可以拿到 i_no, 然后使用 ext4_iget_normal 来获取对应的 inode 的信息, 这里也会缓存一份 dentry 的数据到 dcache

然后 在之后 读取该文件的时候, lookup_fast 的时候去 dcache_hashtable 中查询对应的 dentry 的信息 

进而拿到 inode, 以及 inode 相关附加信息

进而是根据 inode, 以及上下文, 封装 file 对象

完 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

统一网关 Gateway【微服务】

文章目录 1. 前言2. 搭建网关服务3. 路由断言工厂4. 路由过滤器4.1 普通过滤器4.2 全局过滤器4.3 过滤器执行顺序 5. 跨域问题处理 1. 前言 通过前面的学习我们知道,通过 Feign 就可以向指定的微服务发起 http 请求,完成远程调用。但是这里有一个问题&am…

QToolBar、QStatusBar和QDockWidget的使用

1. 工具栏 QToolBar 1.1 创建工具栏 1.1.1 工具栏的基本函数 设置工具栏的停靠区域 参数 Qt::LeftToolBarArea //左边 Qt::RightToolBarArea //右边 Qt::TopToolBarArea //顶部 Qt::BottomToolBarArea //底部 Qt::AllToolBarAreas //所有区域 Qt::NoToolBarArea //没有QMa…

用C#实现简单的线性回归

前言 最近注意到了NumSharp,想学习一下,最好的学习方式就是去实践,因此从github上找了一个用python实现的简单线性回归代码,然后基于NumSharp用C#进行了改写。 NumSharp简介 NumSharp(NumPy for C#)是一…

js动态设置关键侦@keyframes

js动态设置关键侦keyframes 1.前置知识 关键侦keyframes规则通过在动画序列中定义关键侦的样式来控制CSS动画序列的中间步骤 keyframes slidein {from {transform: translateX(0%);}to {transform: translateX(100%);} } // from 等价于 0%;to 等价与 100% // 或…

[UI5] ODATA V4中的CRUD

文章目录 前言一、Read二、Create三、Update四、Delete 前言 ODATA V4在CRUD方面与V2截然不同。 这篇文章简单介绍V4中是如何进行CRUD操作 一、Read Model不再有read方法, 一般是把Path绑定到View中进行读取, 如果需要额外的读取数据,可使用…

mysql进阶 - 存储过程

目录 1. 用途: 2. 相关语法 2.1 创建 2.1.1 语法 2.1.2 示例 2.2 查看存储过程 2.3 调用 2.4 修改存储过程 2.5 删除存储过程 1. 用途: 存储过程广泛存在于一些遗留系统,可以减少代码的编写。而近些年,存储过程很少再用…

UML-类图和类图转化为代码

提示:文章详细的讲解了类图的四种关系,以及每种关系如何转化为对应的代码。 UML-类图和类图转化为代码 一、类于类之间的关系1.依赖关系2.关联关系(1) 单向关联(2) 双向关联(3) 自关联(4) 聚合关联(has-a)(5) 组合关联(contains-a&#xff09…

Servlet-Request

一、预览 在上一篇Servlet体系结构中,我们初步了解了怎么快速本篇将介绍Servlet中请求Request的相关内容,包括Request的体系结构,Request常用API。 二、Request体系结构 我们注意到我们定义的Servlet类若实现Servlet接口时,请求…

企业网站建设中常用的英文翻译

下面好代码网在长期的网站建设业务中总结的,一些在企业网站建设中词语的常用翻译,可以让你的企业网站更具有专业性。如果你做中英文双语版本网站或者外贸网站的请收藏备用。 网站导航 site map 公司简介 PROFILE or COMPANY Profile or Company 综述 Gen…

学习Qt笔记

前言: 学习笔记的内容来自B站up主阿西拜编程 《Qt6 C开发指南 》2023(上册,完整版)_哔哩哔哩_bilibili《Qt6 C开发指南 》2023(上册,完整版)共计84条视频,包括:00书籍介…

【UE Niagara学习笔记】07 - 火焰的热变形效果

目录 效果 步骤 一、创建热变形材质 二、添加新的发射器 2.1 设置粒子材质 2.2 设置粒子初始大小 2.3 设置粒子持续生成 三、修改材质 四、设置粒子效果 在上一篇博客(【UE Niagara学习笔记】06 - 制作火焰喷射过程中飞舞的火星)的基础上继续…

【MySQL】导入导出SQL脚本及远程备份---超详细介绍

目录 前言: 一 navcat导入导出 1.1 导入 1.2 导出 二 mysqldump 导入导出 2.1 导入 2.2 导出 三 load data infile命令导入导出 3.1 导入 3.2 导出 四 远程备份 五 思维导图 前言: 随着当今企业发展,数据库的数据越来越多&…

Qt/QML编程学习之心得:slider(34)

滑条slider,有时也成为进度条progressbar,在GUI界面中也是经常用到的。 import QtQuick 2.9 import QtQuick.Controls 2.0 import QtQuick.Layouts 1.2ApplicationWindow {id:rootvisible: truewidth: 1920height: 720//title: qsTr("Hello World&q…

FreeRTOS系统配置

一、前言 在实际使用FreeRTOS 的时候我们时常需要根据自己需求来配置FreeRTOS,而且不同架构 的MCU在使用的时候配置也不同。FreeRTOS的系统配置文件为FreeRTOSConfig.h,在此配置文件中可以完成FreeRTOS的裁剪和配置,这是非常重要的一个文件&a…

Kubernetes 集群管理—日志架构

日志架构 应用日志可以让你了解应用内部的运行状况。日志对调试问题和监控集群活动非常有用。 大部分现代化应用都有某种日志记录机制。同样地,容器引擎也被设计成支持日志记录。 针对容器化应用,最简单且最广泛采用的日志记录方式就是写入标准输出和标…

必练的100道C语言程序设计练习题(上)

前言: 在计算机编程的世界中,C语言一直是一门备受推崇的语言。它的简洁性、高效性以及广泛应用使得学习C语言成为每一位程序员的必由之路。然而,掌握这门语言并不是一蹴而就的事情,它需要不断的练习和实践。为了帮助各位编程爱好者更好地理解…

整合junit与热部署

整合junit <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.7.0</version></dependency> 测试类上添加SpringBootTest 如&#xff1a; 注意测试类的…

计算机组成原理 CPU的功能和基本结构和指令执行过程

文章目录 CPU的功能和基本结构CPU的功能CPU的基本结构 指令执行过程指令周期概念指令执行方案指令数据流取周期数据流析指周期数据流执行周期数据流中断周期数据流 数据通路的功能和基本结构数据通路的功能数据通路的结构单总线 CPU的功能和基本结构 #mermaid-svg-jr0QOEyC6Q92…

微服务治理:微服务断路器(微服务故障隔离模式)详解

微服务断路器是一种设计模式&#xff0c;可以保护系统免于级联故障&#xff0c;通过限制对故障服务的调用来实现。它的工作原理类似于电气断路器&#xff1a;当服务遇到问题时&#xff0c;它会切断请求流&#xff0c;使其有机会恢复&#xff0c;并防止其他服务被压垮。 工作原…

透过历史的琉璃之窗:古代玻璃制品成分解析--2022年国赛C题获奖论文思考

问题一&#xff1a;数据预处理------>剔除处理无效数据 转化完美成分数据----定和为1 中心化对数比变换------消除定和限制对后续分析的影响 类别量化分析相关性 第1小问------对超过20%的比例期望计数小于5的组别---------Pearson卡方检验法 对不满足卡方前提的组别----…