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 对象

完 
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第24天 | 理论基础 77. 组合

目录 理论基础 什么是回溯法 回溯法的效率 回溯法解决的问题 如何理解回溯法 回溯法模板 77. 组合 💡解题思路 💻实现代码 理论基础 什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 回溯法的效率 虽然回溯法很难&#xff…

前端安全专题

xss (Cross Site Scripting) 跨站脚本攻击 原理 通常指黑客通过"HTML注入"篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。 常见攻击类型 存储型XSS 攻击者将恶意的 JavaScript 脚本存储在网站…

C程序训练:阶乘与溢出

已知n是整数&#xff0c;计算12!3!...n!&#xff0c;并给出最大能够计算的n值是多少&#xff1f; 1. 假设n是int类型&#xff0c;系统用32位表示int类型。代码如下&#xff1a; #include <stdio.h> int main() {int n,sum1,sum1,fact1;int step;for(n2; n<100; n) {…

【Win11】电脑正常联网浏览器却打不开???

今天本来打算打开B站开始今天的学习之旅&#xff0c;一打开却发现。。。 我还以为电脑没联网但是微信可以聊天发消息然后我在dos窗口测了下网络是正常联通的 然后我开始慌了&#xff0c;这阳光明媚的一天不看B站学习怎么行&#xff0c;然后我就开始在百度上冲浪找解决方案&…

探索设计模式的魅力:简单工厂模式

简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;其主要目的是用于创建对象的实例。这种模式通过封装创建对象的代码来降低客户代码与具体类之间的耦合度。简单工厂不是GoF&#xff08;四人帮&#xff09;设计模式之一&#xff0c…

WAMP apache 无法启动(端口 80 未使用)

这段时间系统重装后&#xff0c;安装WAMP Server&#xff0c;装好后点击启动绿了下然后又变成了黄色&#xff0c;托盘图标无论是左键点击还是右键点击都没有反应&#xff0c;wampapache64服务也启动不起来&#xff0c;提示“windows不能在本地计算机启动wampapache”&#xff0…

软件系统部署方案书(Word)

一、 引言 &#xff08;一&#xff09; 编写目的 二、 外部设计 &#xff08;一&#xff09; 标识符和状态 &#xff08;二&#xff09; 约定 1&#xff0e; 数据库涉及字符规范 2&#xff0e; 字段命名规范 &#xff08;三&#xff09; 专门指导 &#xff08;四&#…

基于JAVA开发的数字化智慧工地管理平台源码,可私有化部署、带可视化大屏

智能工地应用价值 智慧工地现场构建了基于物联网的智能化数据传感器通用的管理平台。利用计算机、人工智能、无线通信&#xff0c;全天候现场监视、施工检查、质量管理、服务&#xff0c;提高数字化管理、安全、绿色、施工等现场管理能力&#xff0c;标志着现场管理进入信息化时…

小程序基础学习(插槽)

一&#xff0c;新建一个组件文件 二&#xff0c;设置插槽 三&#xff0c;微信小程序里面插槽没有默认值需要用wxss来设置&#xff0c;检查插槽这个标签是否为空&#xff0c;如果为空则默认值的view显示 四&#xff0c;写入页面 五&#xff0c;插槽代码 <!--components/my-…

bootloader学习笔记及SD卡启动盘制作

Bootloader介绍 在操作系统运行之前运行的一小段代码&#xff0c;用于将软硬件环境初始化到一个合适的状态&#xff0c;为操作系统的加载和运行做准备&#xff08;其本身不是操作系统&#xff09; Bootloader基本功能 1、初始化软硬件环境 2、引导加载linux内核 3、给linux…

磁盘直通卡/阵列卡讲解

服务器SAS卡 ① 华为SR120 (LSI 2308 6Gb SAS直通卡),适合数据安全等级不高或 更换简单 硬盘即插即用 ② 华为SR320 (LSI 2208 6Gb SAS阵列卡 带512M缓存),适合对数据安全等级要求高或追求磁盘性能的客户 推荐上阵列卡 ③ 华为SR130 (LSI 3008 12Gb SAS直通卡),适合数据安全等…

DAY6--learning english

一、积累 1.sip She took a small sip of the hot tea to savor its delicate flavor. 她小口抿了一口热茶&#xff0c;细细品味其中的淡雅滋味。 2.vacuum Expreience the amazing cleaning power of vaccum cleaner. 体验真空吸尘器惊人的清洁能力。 3.stray Stray kitte…

基于JAVA的用户画像活动推荐系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

中霖教育:CPA注册会计师报考注意事项有哪些?

在报考注册会计师时&#xff0c;以下这些注意事项你一定要了解! 1.CPA报考的条件 考生需要具备完全民事行为能力;具有高等专科以上学校毕业学历&#xff0c;或者具有会计或者相关专业中级以上技术职称。 2.专业阶段考试科目为&#xff1a; 《会计》、《审计》、《税法》、《…

ElasticSearch 学习9 spring-boot ,elasticsearch7.16.1实现中文拼音分词搜索

一、elasticsearch官网下载&#xff1a;Elasticsearch 7.16.1 | Elastic 二、拼音、ik、繁简体转换插件安装 ik分词&#xff1a;GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized d…

数据结构与算法:插入排序希尔排序

数据结构与算法&#xff1a;插入排序&希尔排序 插入排序希尔排序 插入排序 假设现在你有一个有序的数组&#xff0c;你要把一个数据插入到数组中&#xff0c;保证插入后依然有序&#xff0c;要怎么做&#xff1f; 对于人来说&#xff0c;这个问题就像是在整理扑克牌&…

第一个 OpenGL 程序:旋转的立方体(VS2022 / MFC)

文章目录 OpenGL API开发环境在 MFC 中使用 OpenGL初始化 OpenGL绘制图形重置视口大小 创建 MFC 对话框项目添加 OpenGL 头文件和库文件初始化 OpenGL画一个正方形OpenGL 坐标系改变默认颜色 重置视口大小绘制立方体使用箭头按键旋转立方体深度测试添加纹理应用纹理换一个纹理 …

0104 AJAX介绍

Ajax 的全称是 Asynchronous Javascript And XML &#xff08;异步 JavaScript 和 XML &#xff09;。 通俗的理解&#xff1a;在网页中利用 XMLHttpRequest 对象和服务器进行数据交互的方式&#xff0c;就是 Ajax Ajax 能让我们轻松实现网页与服务器之间的数据交互。 浏览器…

基础篇_数据持久化(实战-我的B站,MySQL数据库)

文章目录 一. 实战-我的B站1. 功能演示2. 设计数据类数据展示路径参数 3. 设计 Service 类静态资源映射读取文件的时机Stream API 改进 二. MySQL 数据库1. 数据库必要性2. MySQL 安装下载压缩包初始化数据库运行服务器运行客户端 3. 初步使用4. datagrip添加数据源导入数据用 …

【网络安全】【密码学】【北京航空航天大学】实验四、古典密码(上)【C语言实现】

实验四、古典密码&#xff08;上&#xff09; 一、实验目的 1、 通过本次实验&#xff0c;了解古典加密算法的主要思想&#xff0c;掌握常见的古典密码。 2、 学会应用古典密码&#xff0c;掌握针对部分古典密码的破译方法。 二、原理简介 古典密码的编码方法主要有两种&am…