宏观上文件系统在kernel的形态

  • 文件系统运作流程按照:vfs->磁盘缓存->实际磁盘文件系统->通用块设备层->io调度层->块设备驱动层->磁盘。具体流程的详细展现如下如

如何理解文件系统中的数据结构?
  • linux中文件系统还有几种核心数据结构分别是super_blockinodedentryfile.super_block是磁盘文件系统(xfs/ext4)的内存呈现,inode是linux中文件唯一呈现,也是文件本身,存储了文件的元数据。dentry是文件本身的代表,存储了文件的名称和inode.file是文件被打开的状态,每个进程执行文件的系统调用都会实例化file。每一数据结构都会有一些列的函数表定义和私有数据。这个是为了实现不同文件系统而采用的工厂设计模式,这些私有数据是vfs和实际磁盘文件系统交互的核心数据结构。每个实际的磁盘文件系统(ext4/xfs)文件系统针对super_blockinodedentryfile.super_block都会有自己的操作实现,kernel只需要把定义通用接口,这些接口的具体实现都是有实际磁盘文件系统注册后把这些接口操作给实例化,这就达到了vfs和实际文件系统的交互。

struct super_block简单描述

代码语言:javascript

代码运行次数:0

运行

AI代码解释

// struct super_block 省略和一些字段,比较核心的字段描述了下
struct super_block {// 把suoer_block链接到s_list链表 struct list_head	s_list;		// s_blocksize的位数unsigned char		s_blocksize_bits;// 文件系统中块大小unsigned long		s_blocksize;// 支持最大文件大小loff_t			s_maxbytes;	// 文件系统类型struct file_system_type	*s_type;// super_block的操作函数const struct super_operations	*s_op;// dentry函数操作定义const struct dentry_operations *s_d_op;// dentry的指针,指向根节点的rootstruct dentry		*s_root;// 挂载该文件系统的挂载点组成的链表struct list_head	s_mounts;	// 同一种文件系统组成的链表struct hlist_node	s_instances;// 实际文件系统的私有数据void			*s_fs_info;	} __randomize_layout;
struct file_system_type简单描述

代码语言:javascript

代码运行次数:0

运行

AI代码解释

// 每个文件系统在实话时候都会先注册这个文件系统,fs_system_type就是用来描述这个文件系统的
struct file_system_type {// 文件系统名称,比如ext4、xfsconst char *name;// 实际文件提供的mount函数用来初始化super_blockstruct dentry *(*mount) (struct file_system_type *, int,const char *, void *);// 释放文件系统的哈数void (*kill_sb) (struct super_block *);// 内核模块描述struct module *owner;// file_system_type链表struct file_system_type * next;// 同一种文件系统super_block组成的链表struct hlist_head fs_supers;
};// 比如ext4的file_system_type的类型
static struct file_system_type ext4_fs_type = {.owner		= THIS_MODULE,.name		= "ext4",.mount		= ext4_mount,.kill_sb	= kill_block_super,.fs_flags	= FS_REQUIRES_DEV,
};
struct inode简单描述

代码语言:javascript

代码运行次数:0

运行

AI代码解释

// 文件系统中inode描述,其中说明了核心字段的函数
struct inode {// 文件类型umode_t			i_mode;// uid/gid是描述文件的属主kuid_t			i_uid;kgid_t			i_gid;// inode的操作函数,这个是由具体文件系统决定const struct inode_operations	*i_op;// inode属于的超级快struct super_block	*i_sb;// page cache涉及到缓存管理struct address_space	*i_mapping;// inode的编号,单个文件系统内这个是唯一的unsigned long		i_ino;// inode所指向的文件大小loff_t			i_size;// 文件的acess/mofidy/change时间struct timespec64	i_atime;struct timespec64	i_mtime;struct timespec64	i_ctime;// inode链接到哈希链表中struct hlist_node	i_hash;// inode链接到super_block上struct list_head	i_sb_list;union {// 进程打开文件时候的操作函数,这个是与文件类的系统调用对接const struct file_operations	*i_fop;	void (*free_inode)(struct inode *);};// inode的私有数据,一般存储实际文件系统的私有数据void			*i_private; /* fs or device private pointer */
} __randomize_layout;
  • inode在i_mapping是用缓存,其具体的关系如下

struct dentry简单描述

代码语言:javascript

代码运行次数:0

运行

AI代码解释

// 文件系统的目录树是采用组织dentry来呈现
struct dentry {// 指向父目录的dentrystruct dentry *d_parent;// 保存了文件名字和哈希值struct qstr d_name;// 该目录项指向的inodestruct inode *d_inode;// 当目录项名称比较短的时候保存在这里unsigned char d_iname[DNAME_INLINE_LEN];	/* small names */// 定义dentry的操作函数,每个文件系统都针对d_op进行初始化const struct dentry_operations *d_op;// dentry私有数据void *d_fsdata;			/* fs-specific data */union {struct list_head d_lru;		/* LRU list */wait_queue_head_t *d_wait;	/* in-lookup ones only */};// 当前dentry所有父目录项的链表struct list_head d_child;	/* child of parent list *///当前目录项下所有子目录项的链表struct list_head d_subdirs;	/* our children */} __randomize_layout;
struct file简单描述

代码语言:javascript

代码运行次数:0

运行

AI代码解释

// 每当进程打开一个文件都会实例化一个struct file,这里面包含了标准的posix语义的操作
struct file {// 文件路径struct path		f_path;// 文件指向的inodestruct inode		*f_inode;// 定义struct file的操作函数const struct file_operations	*f_op;// 文件的引用计数器atomic_long_t		f_count;// 文件打开的flagsunsigned int 		f_flags;// 文件的modefmode_t			f_mode;// 文件的当前位置loff_t			f_pos;// struct file的私有数据void			*private_data;// 文件的page cache相关的address_spacestruct address_space	*f_mapping;} __randomize_layout
  • 进程打开一个文件的呈现如下面

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

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

相关文章

TDengine与StarRocks在技术架构和适用场景上有哪些主要区别?

TDengine 与 StarRocks 作为国产数据库领域的代表性产品,分别专注于时序数据处理和高性能分析场景,在技术架构和适用场景上存在显著差异。以下从核心架构、数据模型、性能特点及典型应用场景等方面进行对比分析:🏗️ ​​一、技术…

Qt事件_xiaozuo

Qt事件Qt 的事件机制是其实现用户交互和系统响应的核心框架,基于事件驱动模型构建。以下从五个关键方面详细解释其工作原理和用法:1. 事件(QEvent)的定义与分类事件本质:事件是 QEvent 类或其子类的实例,用…

运动控制技术:自动化与智能驱动的核心

一、运动控制概述运动控制技术是自动化技术和电气拖动技术的融合,以工控机、PLC、DSP等为控制器的运动控制技术融合了微电子技术、计算机技术、检测技术、自动化技术以及伺服控制技术等学科的新成果,在工业生产中起着极为重要的作用。早期的运动控制技术…

链表实战指南:手动实现单链表与双链表的接口及OJ挑战(含完整源码)

文章目录一、链表的概念二、链表的分类三、手动实现单链表1.链表的初始化2.链表的打印3.申请新的节点大小空间4.链表的尾插5.链表的头插6.链表的尾删7.链表的头删8.链表的查找9.在指定位置之前插入数据10.在指定位置之后插入数据11.删除指定节点12.删除指定节点之后的数据13.销…

Spring 事件驱动编程初探:用 @EventListener 轻松处理业务通知

一、核心概念与模型Spring 的事件机制是观察者模式(也叫发布-订阅模型)的一种典型实现。它主要由三个核心部分组成:事件 (Event): 承载信息的对象,通常是某种状态变化的通知。可以是继承 ApplicationEvent 的类&#x…

无人机也能称重?电力巡检称重传感器安装与使用指南

在无人机电力巡检中,工程师们常常面临一个棘手难题:如何精确知道新架设或老旧缆线的实际负重? 传统依靠老师傅“肉眼估算”的方法不仅风险极高,而且数据极不准确,给电网安全埋下巨大隐患。难道没有更科学的方法吗&…

第二阶段WinForm-8:特性和反射,加密和解密,单例模式

1_预处理指令 (1)源代码指定了程序的定义,预处理指令(preprocessor directive)指示编译器如何处理源代码。例如,在某些情况下,我们希望编译器能够忽略一部分代码,而在其他情况下&am…

基于mac的智能语音处理与应用开发-环境部署

上一次写文章还是上一次,时隔一年再次开启学习之路。新机mac没有开发环境,在gpt老师的指导下开始学习之路。 mac开发环境的部署参考了b站程序员云谦和Clover-You的视频教程,然后结合自身及gpt老师的帮助现在开始部署。 g老师的&#x1f34e…

Java中使用正则表达式的正确打开方式

正则表达式基础语法Java正则表达式基于java.util.regex包,核心类是Pattern和Matcher。基本语法遵循标准正则规范:. 匹配任意单个字符(除换行符)\d 匹配数字,等价于 [0-9]\w 匹配单词字符,等价于 [a-zA-Z0-9…

Docker中Mysql容器忽略大小写

场景说明 在数据迁移场景中,从一个数据库中将数据迁移到另一个数据,经常会遇到,两个不同数据库之间,一个默认忽略大小写,一个默认不忽略大小写,导致实际业务层服务进行数据库访问时,切换数据库之…

神经网络激活函数:从ReLU到前沿SwiGLU

摘要 本文全面介绍了神经网络中常用的激活函数,包括Sigmoid、Tanh、ReLU等传统函数,以及2017年后出现的Swish、Mish、SwiGLU等新兴函数。每个函数均提供数学定义、优缺点分析、Python实现代码和可视化图像,并附有实际应用建议和性能对比数据,帮助读者根据具体任务选择合适…

线程池常见面试问答

好嘞 &#x1f44d;&#xff0c;我帮你把这些 线程池 并发编程八股文 整理成 问答对照表&#xff08;Q & A&#xff09;&#xff0c;你面试时可以直接用。&#x1f9fe; 线程池常见面试问答一、基础语法 & STLQ1&#xff1a;std::function<void()> 和函数指针的…

Flutter 开发技巧 AI 快速构建 json_annotation model 的提示词

将下面这段复制到AI GPT、DeepSeek 、文心快码 试过效果都可以&#xff0c;不用做任何更改。将 json 数据丢给 AI 就行了 我会提供一段 JSON 数据&#xff0c;请帮我生成 Dart 模型&#xff0c;要求严格如下&#xff1a;1. 使用 json_annotation 包&#xff0c;包含&#xff1a…

【秋招笔试】2025.08.30科大讯飞秋招笔试题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围在线刷题 bishipass.com 科大讯飞 题目一:物品种类统计 1️⃣:使用集合或哈希表统计不同物品编号的数量 2️⃣:利用数学公式 n - 不同种类数 计算最终答案 难度:简单 这道题目的关…

AI 智能体汇总,自动执行任务的“真 Agent”

AI Agent 正在掀起一场静默的效率革命&#xff1a;当 AI 遇上 RPA&#xff0c;真正的“数字员工”时代已经到来最近一段时间&#xff0c;我密集关注了多场 AI Agent&#xff08;智能体&#xff09;的发布会&#xff0c;覆盖了从消费级到企业级的各类产品。一个越来越清晰的趋势…

vue布局

给于2个div块状元素的布局方案1&#xff1a;横向并排&#xff08;Flex Row&#xff09;<template><div class"container"><div class"background">背景</div><div class"panel">内容</div></div> <…

Hysplit大气传输和污染扩散-轨迹聚合标准20%30%用途

1、HYSPLIT轨迹聚合中的百分比标准在HYSPLIT模型中&#xff0c;轨迹聚合&#xff08;Trajectory Clustering&#xff09;用于将大量轨迹按相似性分组&#xff0c;20%和30%是常见的聚合阈值标准&#xff0c;反映轨迹间的空间相似度要求。2、20%和30%的具体含义这两个百分比代表轨…

Linux shell 脚本基础 003

目录 Linux shell 脚本语句 1. for 循环流程控制 1.1 基本语法格式 1.2 常见用法示例 1.3生产案例示例 2. while 循环 2.1 基本语法格式 2.2 常见用法示例 3. case 语句 3.1 基本语法格式 3.2 常见用法示例 3.3生产案例示例 4. shell 函数 4.1 函数的定义 4.2 函…

7.1elementplus的表单

Element Plus 表单由以下几个关键部分构成&#xff1a;<el-form>: 表单容器。它是整个表单的根组件&#xff0c;负责管理表单数据、校验规则、布局方式等。<el-form-item>: 表单项容器。用于包裹一个具体的表单控件&#xff08;如输入框、选择器等&#xff09;及其…

TF-IDF:文本分析的“火眼金睛”

TF-IDF&#xff1a;文本分析的“火眼金睛” 在信息爆炸的时代&#xff0c;我们每天都会接触到海量的文本数据。如何从这些数据中快速找出最重要的信息&#xff1f;TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;算法就是一种非常实用的工具&#xf…