linux内核如何根据文件名索引到文件内容

news2024/10/11 8:29:55

https://zhuanlan.zhihu.com/p/78724124

根据文件名索引到文件内容

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

现在举一个具体的例子,来说明文件是怎么读取到的,比如读取/home/bzw/test里的内容,目录结构如下图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
假设文件系统的的简单分区如下
在这里插入图片描述
获取home对应的inode号:先找根目录’/'的inode(不考虑缓存):根目录的inode号可以从super_block中获取,ext4文件系统的根目录inode号为2(xfs文件系统根目录inode号是64,ceph文件系统根目录inode号是1),所以在索引区读取inode号为2存的inode内容。假如inode中存的block地址是1000,那么去数据区读取地址为1000的block存的内容,内容如下图所示。
地址为1000的block存的内容
地址为1000的block存的内容
地址为1000的block里面存了20个目录项(struct ext4_dir_entry),可以找到目录home对应的inode号为100。

获取bzw对应的inode号:上一步获取到了目录home的inode号,在索引区读取inode号为100存的inode内容。假如inode中存的block地址为2000,那么去读地址为2000的block存的内容,内容如下图所示。
地址为2000的block存的内容
地址为2000的block存的内容
地址为2000的block里面存了3个目录项(struct ext4_dir_entry),可以找到目录bzw对应的inode号为200。

获取test对应的inode号:上一步获取到了目录bzw的inode号,在索引区读取inode号为200存的inode内容。假如inode中存的block地址为3000,那么去读地址为3000的block存的内容,内容如下图所示。
地址为3000的block存的内容
地址为3000的block存的内容
地址为3000的block里面存了2个目录项(struct ext4_dir_entry),可以找到文件test对应的inode号为300。

获取test对应的内容:上一步获取到了文件test的inode号,在索引区读取inode号为300存的inode内容。假如inode中存的block地址为4000,那么去读地址为4000的block存的内容。这个时候就完成了操作。
这里注意如果test内容很大,那么在inode里面存的block地址就不止一个了。

可以以ext4中的struct ext4_inode为例

struct ext4_inode {
__le16 i_mode; /* File mode /
__le16 i_uid; /
Low 16 bits of Owner Uid /
__le32 i_size_lo; /
Size in bytes /
__le32 i_atime; /
Access time /
__le32 i_ctime; /
Inode Change time /
__le32 i_mtime; /
Modification time /
__le32 i_dtime; /
Deletion Time /
__le16 i_gid; /
Low 16 bits of Group Id /
__le16 i_links_count; /
Links count /
__le32 i_blocks_lo; /
Blocks count /
__le32 i_flags; /
File flags /

__le32 i_block[EXT4_N_BLOCKS];/
Pointers to blocks / 这里面存的就是block的地址
__le32 i_generation; /
File version (for NFS) /
__le32 i_file_acl_lo; /
File ACL /
__le32 i_size_high;
__le32 i_obso_faddr; /
Obsoleted fragment address /

__le16 i_extra_isize;
__le16 i_checksum_hi; /
crc32c(uuid+inum+inode) BE /
__le32 i_ctime_extra; /
extra Change time (nsec << 2 | epoch) /
__le32 i_mtime_extra; /
extra Modification time(nsec << 2 | epoch) /
__le32 i_atime_extra; /
extra Access time (nsec << 2 | epoch) /
__le32 i_crtime; /
File Creation time /
__le32 i_crtime_extra; /
extra FileCreationtime (nsec << 2 | epoch) /
__le32 i_version_hi; /
high 32 bits for 64-bit version /
__le32 i_projid; /
Project ID */
};
EXT4_N_BLOCKS定义如下,即为15,其中EXT4_IND_BLOCK为12,表示有12个直接索引表,然后有1个一级间接索引表,1个二级间接索引表,1个三级间接索引表。

/*

  • Constants relative to the data blocks
    */
    #define EXT4_NDIR_BLOCKS 12
    #define EXT4_IND_BLOCK EXT4_NDIR_BLOCKS
    #define EXT4_DIND_BLOCK (EXT4_IND_BLOCK + 1)
    #define EXT4_TIND_BLOCK (EXT4_DIND_BLOCK + 1)
    #define EXT4_N_BLOCKS (EXT4_TIND_BLOCK + 1)
    inode_hashtable

那么根目录inode号为2是怎么获取到的?

我们可以知道,在mount文件系统时,会在内存中建立一个super_block;而在struct super_block中有struct dentry *s_root成员,s_root就指向的是根目录的dentry,而在struct dentry中有struct inode *d_inode成员,保存的是根目录的inode,inode号就可以从inode中获取。不需要再去读索引区中inode为2的inode内容,因为这部分内容已经在缓存中了,只需要去根目录具体所指的block区读取目录项即可。

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

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

相关文章

迅为RK3568开发板驱动指南第六篇-平台总线

文档教程更新至第六篇 第1篇 驱动基础篇 第2篇 字符设备基础 第3篇 并发与竞争 第4篇 高级字符设备进阶 第5篇 中断 第6篇 平台总线 未完待续&#xff0c;持续更新中... 视频教程更新至十一期 第一期_驱动基础 第二期_字符设备基础 第三期_并发与竞争 第四期_高级字…

解释模块化开发及其优势,并介绍常用的模块化规范。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 模块化开发⭐ 模块化开发的优势⭐ 常用的模块化规范⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是…

公众号hanniman往期精选

目录 一、AI产品分析&#xff08;10篇&#xff09; 二、AI产品经理&#xff08;10篇&#xff09; 三、AI技术&#xff08;10篇&#xff09; 四、AI行业及个人成长&#xff08;10篇&#xff09; 一、AI产品分析 1、【重点】深度 | 关于AIGC商业化的13个非共识认知&#xff08;80…

华为OD机试 - 滑动窗口最大和

滑动窗口的经典题型&#xff0c;重复题目 #include <stdio.h> #include <string.h> #include <stdlib.h>#define MAX(a,b) ((a) > (b) ? (a) : (b)) int main() {int n;scanf("%d", &n);int *list malloc(sizeof(int) * n);for (int i …

[学习笔记]DeepWalk图神经网络论文精读

参考资料&#xff1a;DeepWalk【图神经网络论文精读】 word2vec 相关论文&#xff1a; Efficient Estimation of Word Representations in Vector Space Distributed Representations of Words and Phrases and their Compositionality 随机游走Ramdom Walk简述 通过随机游…

LLMs之Falcon 180B:Falcon 180B的简介、安装、使用方法之详细攻略

LLMs之Falcon 180B&#xff1a;Falcon 180B的简介、安装、使用方法之详细攻略 导读&#xff1a;Falcon-180B是一个由TII发布的模型&#xff0c;它是Falcon系列的升级版本&#xff0c;是一个参数规模庞大、性能优越的开放语言模型&#xff0c;适用于各种自然语言处理任务&#x…

Net跨平台UI框架Avalonia入门-样式详解

设计器的使用 设计器预览 在window和usercontrol中&#xff0c;在代码中修改了控件&#xff0c;代码正确情况下&#xff0c;设计器中就可以实时看到变化&#xff0c;但是在样式&#xff08;Styles&#xff09;文件中&#xff0c;无法直接看到&#xff0c;需要使用设计器预览D…

uni-app 前面项目(vue)部署到本地win系统Nginx上

若依移动端的项目&#xff1a;整合了uview开源ui框架&#xff0c; 配置后端请求接口基本路径地址&#xff1a; 打包复现到nginx下&#xff1a; 安装个稳定版本的&#xff1a;nginx-1.24.0 部署配置&#xff1a; 增加了网站&#xff1a;8083端口的&#xff0c; 网站目录在ngi…

Reactor

1.epoll底层工作原理 creat: 红黑树 就绪队列 回调机制 control: 用户告诉内核做什么事情&#xff0c;就是操作红黑树 wait: 操作就绪队列 2.LT ET模式 3.Reactor 4.前摄式

懒汉式逆向APK

作者&#xff1a;果然翁 通过各方神仙文档,以及多天调试,整理了这篇极简反编译apk的文档(没几个字,吧).轻轻松松对一个apk(没壳的)进行逆向分析以及调试.其实主要就是4个命令. 准备 下载apktool &#xff1a;https://ibotpeaches.github.io/Apktool/install/下载Android SDK …

被问到: http 协议和 https 协议的区别怎么办?别慌,这篇文章给你答案

前言 作为软件测试师&#xff0c;大家都知道一些常用的网络协议是我们必须要了解和掌握的&#xff0c;比如 HTTP 协议&#xff0c;HTTPS 协议就是两个使用非常广泛的协议&#xff0c;所以也是面试官问的面试的时候问的比较多的两个协议&#xff1b;因为这两个协议有相似和关联的…

CSP 202209-1 如此编码

答题 题目就是字多 #include<iostream>using namespace std;int main() {int n,m;cin>>n>>m;int a[n],c[n1];c[0]1;for(int i0;i<n;i){cin>>a[i];c[i1]c[i]*a[i];}for(int i0;i<n;i){cout<<(m%c[i1]-m%c[i])/c[i]<< ;} }

基于 Flink CDC 高效构建入湖通道

摘要&#xff1a;本文整理自阿里云 Flink 数据通道负责人、Flink CDC 开源社区负责人&#xff0c; Apache Flink PMC Member & Committer 徐榜江&#xff08;雪尽&#xff09;&#xff0c;在 Streaming Lakehouse Meetup 的分享。内容主要分为四个部分&#xff1a; 1. Flin…

2.4 选择结构语句

选择结构语句根据是否满足某个条件确定执行哪些操作&#xff0c;分为if条件语句和switch条件语句。 1. 单分支if语句 &#xff08;1&#xff09;if语句是指如果满足某种条件&#xff0c;就进行某种处理&#xff0c;格式如下。 if(条件) {// 执行语句 } 根据上述格式中&…

有限状态机的概念

一、有限状态机的概念 有限状态机简称状态机&#xff0c;是表示有限个状态&#xff0c;以及在状态之间的转移和动作等行为的数学模型。状态机的要素有状态和状态转移两个。 在Unity中&#xff0c;动画状态机最重要的属性就是节点和连线&#xff0c;其中每个节点都是一个动画片…

zotero的使用教程

1. zotero安装 1.1 下载 官网下载地址:Zotero 1.2 安装 建议自定义安装路径,不要安装在C盘。如以下步骤: 2. 插件安装 一般安装以下四种插件,即茉莉花(Jasminum)、zotfile、zotero-scihub、zotero-pdf-translate。以安装茉莉花插件为例进行说明,如图1所示,其余插件安…

Linux mac Windows三系统 局域网文件共享方法

主要工具&#xff1a; Samba是一个开源的软件套件&#xff0c;允许Linux系统与Windows系统之间共享文件和打印机。 一、首先是Linux共享的设置 ①安装 sudo apt-get install samba ②创建共享文件夹 sudo mkdir /home/share ③配置用户 sudo smbpasswd -a kequan ④修改…

软件测评的必要性,第三方软件测试机构推荐

软件测评报告 1、什么是软件测评报告&#xff1f; 测试报告是指把测试的过程和结果写成文档&#xff0c;对发现的问题和缺陷进行分析&#xff0c;为纠正软件的存在的质量问题提供依据&#xff0c;同时为软件验收和交付打下基础。 2、软件测评报告的作用 一份详细的测试报告…

git打tag和版本控制规范

我们在开发中经常会遇到要打tag的情况&#xff0c;但这个tag应该如何打呢&#xff1f;我不知道大家平时是怎么打的&#xff0c;但我基本就是从1.0.0开始进行往上递增&#xff0c;至于如何递增&#xff0c;基本凭感觉。今天同事新打了一个tag进行发版&#xff0c;然后被架构点名…

计算机竞赛 基于深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的视频多目标跟踪实现 …