首页 > 其他分享 >解析虚拟文件系统的调用

解析虚拟文件系统的调用

时间:2023-11-09 23:01:20浏览次数:32  
标签:文件 ext4 mount 文件系统 调用 file home 解析

Linux 可以支持多达数十种不同的文件系统。它们的实现各不相同,因此 Linux 内核向用户空间提供了虚拟文件系统这个统一的接口,来对文件系统进行操作。它提供了常见的文件系统对象模型,例如 inode、directory entry、mount 等,以及操作这些对象的方法,例如 inode operations、directory operations、file operations 等。

解析虚拟文件系统的调用_文件系统

解析系统调用是了解内核架构最有力的一把钥匙。

  • mount 系统调用用于挂载文件系统;
  • open 系统调用用于打开或者创建文件,创建要在 flags 中设置 O_CREAT,对于读写要设置 flags 为 O_RDWR;
  • read 系统调用用于读取文件内容;
  • write 系统调用用于写入文件内容。

内核是不是支持某种类型的文件系统,需要我们进行注册才能知道。例如, ext4 文件系统,就需要通过 register_filesystem 进行注册,传入的参数是 ext4_fs_type,表示注册的是 ext4 类型的文件系统。这里面最重要的一个成员变量就是 ext4_mount。

register_filesystem(&ext4_fs_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,
};

如果一种文件系统的类型曾经在内核注册过,这就说明允许你挂载并且使用这个文件系统。

来解析经过 mount 之后数据结构之间的关系。

我们假设根文件系统下面有一个目录 home,有另外一个文件系统 A 挂载在这个目录 home 下面。在文件系统 A 的根目录下面有另外一个文件夹 hello。由于文件系统 A 已经挂载到了目录 home 下面,所以我们就有了目录 /home/hello,然后有另外一个文件系统 B 挂载在 /home/hello 下面。在文件系统 B 的根目录下面有另外一个文件夹 world,在 world 下面有个文件夹 data。由于文件系统 B 已经挂载到了 /home/hello 下面,所以我们就有了目录 /home/hello/world/data。

解析虚拟文件系统的调用_文件系统_02

文件系统是树形关系。如果所有的文件夹都是几代单传,那就变成了一条线。注意看图中的三条斜线。

第一条线是最左边的向左斜的 dentry 斜线。每一个文件和文件夹都有 dentry,用于和 inode 关联。

第二条线是最右面的向右斜的 mount 斜线,因为这个例子涉及两次文件系统的挂载,再加上启动的时候挂载的根文件系统,一共三个 mount。

第三条线是中间的向右斜的 file 斜线,每个打开的文件都有一个 file 结构,它里面有两个变量,一个指向相应的 mount,一个指向相应的 dentry。

对于虚拟文件系统的解析,有关文件的数据结构层次多,而且很复杂。

解析虚拟文件系统的调用_文件系统_03

对于每一个进程,打开的文件都有一个文件描述符,在 files_struct 里面会有文件描述符数组。每个一个文件描述符是这个数组的下标,里面的内容指向一个 file 结构,表示打开的文件。这个结构里面有这个文件对应的 inode,最重要的是这个文件对应的操作 file_operation。如果操作这个文件,就看这个 file_operation 里面的定义了。

对于每一个打开的文件,都有一个 dentry 对应,虽然叫作 directory entry,但是不仅仅表示文件夹,也表示文件。它最重要的作用就是指向这个文件对应的 inode。

如果说 file 结构是一个文件打开以后才创建的,dentry 是放在一个 dentry cache 里面的,文件关闭了,他依然存在,因而他可以更长期地维护内存中的文件的表示和硬盘上文件的表示之间的关系。

inode 结构就表示硬盘上的 inode,包括块设备号等。



标签:文件,ext4,mount,文件系统,调用,file,home,解析
From: https://blog.51cto.com/key3feng/8286171

相关文章

  • python升级到3.12版本, 开发模式安装包, 在vscode下Pylance无法解析的问题处理
    问题描述在python3.11版本下开发python库,为方便调测,使用开发模式安装包.使用如下命令:pipinstall-e.其中-e参数表示开发模式下安装python包,它并没有把包相关文件拷贝到site-packages目录,而是创建一个链接指向当前的开发库.这样,当自己开发的包修改后会立即生效,......
  • 标题:Dubbo RPC开发中的序列化问题:深度解析反序列化导致的HashMap异常
    DubboRPC开发中的序列化问题:深度解析反序列化导致的HashMap异常在使用DubboRPC进行开发时,我们可能会遇到一些出乎意料的问题。其中之一就是在进行远程调用时,内部嵌套对象出现与预期不符的HashMap。这个问题的根源在于反序列化过程中找不到对象,导致解析成了HashMap。在这篇博客......
  • 第一章 引言 —— 现代密码学(杨波)课后题答案解析
    第一章作业参考答案1.设仿射变换的加密是E11,23(m)=11m+23(mod26),对明文“THENATIONALSECURITYAGENCY”加密,并使用解密变换D11,23(c)=11-1(c-23)(mod26)验证你的加密结果。解:T=19,11·19+23(mod26)=24,TÞY     H=7,11·7+23(mod26)=22,HÞWE=4,11·4+23(mod26)=15......
  • 分布式文件系统FastDFS
    目录目前系统存在的缺点分布式文件系统FastDFS介绍概念架构文件上传文件下载目前系统存在的缺点目前是通过tomcat提供虚拟目录的方式供用户访问;当然也可以通过nginx实现静态资源访问的方式文件冗余在tomcat挂了的情况下不能提供服务;目前是单一文件服务的存储(依赖tomcat不能进......
  • 深入解析情感分析技术:从篇章到属性
    情感分析是自然语言处理的核心领域,专注于挖掘文本的主观情感。本文深入探讨了从篇章到属性级的情感分析技术,强调了上下文的重要性,并展示了Python和PyTorch的实践应用。通过深入了解这些技术背后的原理,我们揭示了深度学习在情感分析中的强大潜力和实际价值。关注TechLead,分享AI......
  • linux文件系统与日志分析
    Linux文件系统inode表结构每一个inode表记录对应的保存了以下信息:inodenumber节点号文件类型权限UIDGID链接数(指向这个文件名路径名称个数)该文件的大小和不同的时间戳指向磁盘上文件的数据块指针有关文件的其他数据 ls -i:查看inode号 sta......
  • winform调用WebApi
    post请求:publicstaticstringHttpPost(stringurl,stringbody){//ServicePointManager.ServerCertificateValidationCallback=newRemoteCertificateValidationCallback(CheckValidationResult);Encodingencoding=En......
  • 使用Python调用API接口获取淘宝商品数据
    一、引言随着互联网的发展,电子商务已经成为了我们生活中不可或缺的一部分。淘宝作为中国最大的电子商务平台,其商品种类繁多,价格透明,购物方便,深受消费者的喜爱。然而,淘宝的商品数据量庞大,如果我们想要对淘宝的商品进行一些分析,例如商品的价格趋势、销量趋势等,就需要从淘宝的服务器上......
  • C语言程序设计 函数递归调用示例
    函数递归调用示例(教材习题5.3,运行结果012345)#include<stdio.h>voidfun(intk);voidmain(){intw=5;fun(w);}voidfun(intk){if(k>0)fun(k-1);printf("%d",k);}......
  • CXF学习笔记(2)-HelloWorld!-客户端调用
    上一节中已经成功的发布了一个服务端webservice,这一部分将默认客户端调用webservice这里我们重新建立了一个新的工程CXF-Client,把上一节中列举的jar包都搞过来即可,调用方式采用了和RMI类似的机制,即客户端直接服务器端提供的服务接口(interface),CXF通过运行时代理生成远程服务......