虚拟文件系统

2023-11-09

VFS的层次

文件系统实现与用户进程(或C库)之间。

 

文件系统分类

基于磁盘的文件系统(ext2/3  fat  iso9660…)、虚拟文件系统(proc)、网络文件系统(nfs)

 

 

通用文件模型

VFS提供一种结构模型,包含了一个强大的文件系统所应具备的所有组件。所有的文件系统实现,都必须提供与VFS定义的结构配合的例程,以弥补两种试图之间的差异。

 

文件描述符

一个整数,在用户层所有有关文件的操作中用于标识一个文件,在打开文件时由内核创建,特定于进程。

 

 

inode

 

l  inode是什么?

²  inode用来存放文件的元数据(例如,文件的创建者、文件的创建日期、文件的大小等等)

²  注意inode并不包含文件名。

 

l  inode的内容

inode包含文件的元信息,具体来说有以下内容:

²  文件的size、文件属主的User ID、Group ID

 

²  文件的读、写、执行权限

²  文件的时间戳,:ctime(inode上一次变动的时间)、mtime(文件内容上一次变动的时间)、atime(文件上一次打开的时间)。

²  链接数,即有多少文件名指向这个inode。

²  文件数据分布在哪些磁盘Block。

 

l  inode的状态

每个inode处于三种状态中的一个:

²  inode位于内存中,未关联到文件;(inode_unused)

²  inode位于内存中,由一个或多个进程使用,已与磁盘同步;(inode_in_used)

²  inode处于活动使用状态,与磁盘上内容未同步,脏inode;

 

l  inode是如何组织的?

²  内核使用两种方式组织inode。

²  链表:每个inode都有一个i_list成员,可将inode存储在链表中。(inode出现在特定于超级块的链表中i_sb_list,同时出现在特定于状态的链表中,例如inode_in_used)

²  散列:每个inode同时出现在一个散列表中(根据inode号快速访问inode)。

 

l  目录是什么?

²  Linux下,目录也是文件,也有inode和数据部分,其数据部分内容如下:

第一部分表示对应inode的编号(系统内唯一),第二部分表示文件或目录的名字。

内核如何访问/user/bin/emacs

 

首先读取根目录(这个在内核中一直被维护,),在根目录文件的数据部分查找user这个目录项,根据其中的inode编号,获取inode。bin的查找类似,一直到查找到emacs,找到emacs对应的inode,该inode的数据部分即emacs这个文件(普通数据文件)的内容。

图示:

 

 

目录项缓存dentry

 

l  引入dentry

 

上述访问/user/bin/emacs过程非常耗时,需要不断地读取inode和对应的数据部分。为了加速,内核将之前访问过的目录或文件(统称为目录项)缓存起来,下次再访问同样的目录项(例如,/user/bin/vi的/user/bin/部分)时,可以直接找到对应的inode(上图中为10号)。

 

l  dentry的目的:

dentry的主要用途是建立文件名和inode之间的关联。

所以该结构体包括两个最主要的字段,d_inoded_name

其中,d_name为文件名。qstr是内核对字符串的封装(可以理解为带有散列值的char*)。

d_inode是与该文件名对应的inode。

 

l  dentry结构体:

struct dentry {

    

 

/* Where the name belongs to - NULL is negative */

    struct inode *d_inode; 

 

struct qstr d_name;

 

struct dentry *d_parent/* parent directory */

    union {

    struct list_head d_child/* child of parent list */

    struct rcu_head d_rcu;

    } d_u;

    struct list_head d_subdirs/* our children */

    struct dentry_operations *d_op;

    struct super_block *d_sb/* The root of the dentry tree */

    unsignedchard_iname[DNAME_INLINE_LEN_MIN]; /* small names */

 

};

 

l  什么时候创建

在VFS(以及文件系统实现)读取一个目录项(目录或普通文件)后,则创建一个dentry来缓存找到的数据。

 

l  内存中这些dentry如何组织管理

²  结构:各个dentry实例组成了一个网络,例如,当前dentry实例对应的所有文件和子目录相关联的dentry都归入到d_subdirs中。

²  组织方式一:内核所有活动的dentry实例都保存在一个散列表中,该散列表使用dentry_hashtable实现(全局dentry散列表)。

²  组织方式二:LRU链表,长时间不使用的dentry会被删除。

 

 

链接link

 

l  两类链接:符号链接(软链接)和硬链接。

l  符号链接(软链接)文件使用自己的inode,该inode的数据部分包含了一个字符串,给出了链接目标的路径。

l  硬链接创建时,使用了已有的inode编号。硬链接建立以后,无法区分原来的文件和新建的硬链接文件。这种情况下,inode使用计数器来确保文件删除操作中,当没有其他文件使用该inode时,才能真正删除该inode。

示意图:

 

 

 

 

特定于进程的信息

struct task_struct {

     ...

     /* 进程的文件系统相关的信息*/

     struct fs_struct *fs;

     /* 该进程打开的文件 */

     struct files_struct *files;

     ...

}

 

struct files_struct {

     ...

     struct fdtable fdtab;

     struct file * fd_array[NR_OPEN_DEFAULT];

};

 

struct file {

     ...

 

struct path *f_path;

     loff_t   f_pos;

     ...

 

};

 

 

struct file_operations {

     ...

     ssize_t (*write) (struct file *, constchar __user *, size_t, loff_t *);

     int (*readdir) (struct file *, void *, filldir_t);

     unsignedint (*poll) (struct file *, struct poll_table_struct *);

     int (*ioctl) (struct inode *, struct file *, unsignedintunsignedlong);

     int (*mmap) (struct file *, struct vm_area_struct *);

     int (*open) (struct inode *, struct file *);

     ...

};

 

struct file_operations->open函数实质上是将一个file对象关联到一个inode。

poll函数也在其中。

 

 

 

从task到dentry/inode

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

虚拟文件系统 的相关文章

  • [Uboot] 添加自己配置文件defconfig以及头文件

    一 添加配置文件 1 拷贝 uboot configs下自己单板的配置文件 拷贝并且重命名 cp mx6ull 14x14 evk emmc defconfig my imx defconfig 2 配置configs 很多情况下我们都是默
  • ARM上电启动及Uboot代码分析

    注意 xff1a 由于文档是去年写的 xff0c 内有多个图片 xff0c 上传图片很麻烦 xff08 需要截图另存插入等等 xff09 xff0c 我把文章的PDF版本上传到了CSDN下载资源中 为了给自己赚点积分 xff0c 所以标价2
  • 【教程】保姆级红米AX6000刷UBoot和OpenWrt固件

    转载请注明出处 xff1a 小锋学长生活大爆炸 xfxuezhang cn 目录 开启SSH 刷入UBoot 刷入Openwrt 设置Openwrt 刷回小米原厂固件 相关文件已为大家上传到国内云盘 xff1a https xfxuezha
  • 最新uboot的Kbuild系统 3 .config的生成

    前面的工作产生了一个conf 关键点是由conf产生 config的过程 最后是通过执行 scripts kconfig conf defconfig 61 arch configs rpi defconfig Kconfig 生成的 Kc
  • uboot环境变量分析

    项目情景 最近我在一个新平台的开发过程中遇到烧录问题 具体的问题是使用原厂提供的烧录脚本烧录成功 但是固件却没有更新 其中kernel和dtb烧录指令如下 adnl exe Partition M mem P 0x1000000 F lin
  • 嵌入式开发(S5PV210)——u-boot中如何确定启动方式

    1 嵌入式设备确认启动方式 设备确认启动方式分为硬件方式和软件方式 硬件方式是通过芯片某几个引脚的高低电平来决定启动方式 软件方式就是通过代码设置来决定启动方式 1 硬件方式 比如S5PV210芯片 通过拨码开关去设置芯片引脚的高低电平来设
  • 嵌入式开发(S5PV210)——u-boot的不同来源和目录结构

    1 u boot的不同来源和联系 uboot的来源大致有三个途径 uboot官网下载 Soc厂商提供 开发板厂商提供 假设某个厂商推出新的Soc Soc厂商的工程师会去uboot的官网下载uboot 然后把此款Soc的开发板的uboot移植
  • uboot启动第一阶段详解——汇编代码部分start.S

    前言 uboot启动第一阶段是用汇编语言实现的 大部分都是Soc内部的初始化 可以理解成一些通用的初始化 只要使用该款Soc 第一阶段的初始化流程基本是一样的 不直接用C语言进行初始化是因为 C语言运行需要一定的环境 比如栈的设置 而汇编代
  • IMX6ULL NXP官方原版u-boot编译烧录体验以及出现的问题

    编译 guangjie ubuntu work imx6ull uboot imx rel imx 4 1 15 2 1 0 ga xgj cat make imx6ull emmc sh bin bash make ARCH arm CR
  • uboot启动第二阶段——C语言

    1 给全局变量gd分配内存 详情参考 uboot中重要的全局变量 gd 2 计算重定位的代码长度 armboot start word start monitor flash len bss start armboot start 要重定位
  • 高合汽车旗下可进化超跑SUV高合HiPhi X亮相海口国际新能源车展

    2021年1月8日 高端新能源智能出行品牌高合汽车旗下高合HiPhi X亮相第三届海口国际新能源汽车展览会 华人运通高合汽车创始人丁磊在现场透露 上市至今高合HiPhi X限量3000辆创始版车型即将预订售罄 累计收获了32000多位留资用
  • linux rootfs制作

    作一个嵌入式Linux rootfs 并且实现 web 服务 1 文件系统简介 理论上说一个嵌入式设备如果内核能够运行起来 且不需要运行用户进程的话 是不需要文件系统的 文件系统简单的说就是一种目录结构 由于 linux操作系统的设备在系统
  • 将uboot,kernel,rootfs下载到开发板上

    1 为什么要下载 所谓下载 也称烧录 部署 1 1 什么是u boot Hi3518EV200 单板的 Bootloader 采用 U boot u boot是一种普遍用于嵌入式系统中的Bootloader Bootloader是在操作系统
  • U-Boot顶层Makefile详解

    文章目录 一 U Boot工程目录分析 1 打包编译好的uboot 2 目录介绍 1 arch 2 board 3 configs 4 Makefile 5 config 6 README 二 VSCode工程创建 1 新建工程 2 屏蔽不
  • 如何在U-Boot和Linux内核中添加自定义的ATAG变量?

    我要添加定制atagU Boot 和 Linux 内核中的变量 我怎样才能做到这一点 有没有什么程序可以添加ATAG变量在U Boot and Linux 最新的 Linux 内核正试图废弃ATAGS with 设备树 但是 那setup
  • 如何从u-boot启动Linux内核?

    我的 Linux 内核镜像uImage在我的U盘里 我想从 U Boot 启动它 还有设备树文件am335x evm dtb在我的U盘里 我所做的如下 U Boot usb start Re start USB USB0 scanning
  • lv12 uboot源码配置编译 8

    目录 1 uboot源码获取 2 uboot特定 3 uboot源码结构 3 1 平台相关代码 3 1 1 arch 3 1 2 board 3 2 平台无关代码 3 2 1 common下放的都是uboot的命令 3 3 配置文件 帮助文
  • Yocto 添加自定义 UBoot 环境变量

    我正在尝试通过 Yocto 构建过程添加两个新的 u boot 环境变量 My file u boot imx 2021 04 bbappend包含 FILESEXTRAPATHS prepend THISDIR PN SRC URI fi
  • u-boot:搬迁

    这是一个与u boot相关的基本问题 为什么 u boot 代码会自行重新定位 好吧 如果 u boot 是从 NOR flash 或启动 ROM 空间执行 那么这是有道理的 但如果它已经从 SDRAM 运行 为什么它必须再次重新定位自己呢
  • 如何在uboot中制作“if”和比较语句?

    我是 uboot 和 tftp 编程的新手 基于this url http www denx de wiki view DULG CommandLineParsing 有如何制作if像这样的声明if imi addr then echo I

随机推荐

  • linux查看设备网卡MAC和IP地址以及设置MAC ip的注意事项

    1 查看设备的MAC和IP Linux Unix操作系统熟悉的人都通常是用console命令控制台来进行相应的操作 Linux Unix操作系统查看网卡mac地址的方法可以通过以下命令获得 1 ifconfig a 2 ip link sh
  • 华为OD机试 - 简单的解压缩算法

    题目描述 现需要实现一种算法 能将一组压缩字符串还原成原始字符串 还原规则如下 1 字符后面加数字N 表示重复字符N次 例如 压缩内容为A3 表示原始字符串为AAA 2 花括号中的字符串加数字N 表示花括号中的字符重复N次 例如压缩内容为
  • Ubuntu检查apt-get软件列表

    1 搜索所有列表 sudo apt cache search all 2 搜索所有软件并去掉重复 sudo apt cache search all wc 3 检索指定软件 sudo apt cache search all grep gc
  • Android 全局黑白化-模拟颜色空间

    概述 平台 RK3568 Android 11 在一些特殊的日子 如默哀日 灾难日 纪念日 哀悼日等 许多的APP 网页 海报等都开始使用黑白色主题 Android 的全局黑白实现方案 可以考虑使用模拟颜色空间的方法 借助硬件加速渲染选项
  • Altium Designer 20 (14)——绿色报错消除

    一 问题 再更新完PCB之后会有绿色报错 二 问题解决 这是一种错误提示 2 1 解决一 按下TM 复位绿色报错 但是移动就会出现 2 2 解决二 设计规则检查 关掉所有检查 留下电器检查 这样要还是存在绿色报错 点击TM 2个按键就好了
  • 实现KNN算法&搭建人工神经网络ANN——第三次数据挖掘实验

    实验结果直接戳这里免费下载实验报告 决策树算法的实验还没做 做了之后再上传吧 最近有点忙555 文章目录 1 KNN算法 1 1 KNN算法原理 1 2 KNN算法的优点 1 3 KNN算法的缺点 1 4 KNN的做法 目的 1 5 编程实
  • qt 正则表达式

    以上是正则表达式的格式说明 以下是自己写的正则表达式 22 25行 是一种设置正则表达式的方式 29 34行 29行 new一个正则表达式的过滤器对象 30行 正则表达式 的过滤格式 这个格式是0 321的任意数字都可以输入 31行 将过滤
  • 8月21日星期三 恒指/美原油/美黄金 走势分析

    财经早餐 2019年8月21日星期三 重点关注的财经数据与事件 20 30 加拿大7月CPI月率 22 00 美国7月成屋销售总数年化 22 30 美国至8月16日当周EIA原油库存 次日02 00 美联储公布7月货币政策会议纪要 恒指 恒
  • csp试题1:小明种苹果

    csp试题1 小明种苹果 题目 分析 代码 总结 题目 题目描述 小明在他的果园里种了一些苹果树 为了保证苹果的品质 在种植过程中要进行若干轮疏果操作 也就是提前从树上把不好的苹果去掉 第一轮疏果操作开始前 小明记录了每棵树上苹果的个数 每
  • javaSE基本思维导图

  • 给ECharts添加右键点击事件,实现右键功能菜单

    由于项目的需要 使用ECharts 的力导向图来实现 整个EDW数据架构的血缘分析 由于ECharts并没有给组件定义有右键的事件 同时ECharts是开源的项目 所以研究了下源码 将ECharts2 2 2 的echarts js给修改了
  • 常见火狐不支持问题

    如cards CardAdmin ExportMemData vm页面要检查页面的脚本是否闭合 完整 是否有某个方法不正确所引起的 scm ProductAdmin ProductList vm a href aaa a 要改为 a hre
  • 从零开始入门 K8s

    作者 阚俊宝 阿里巴巴高级技术专家 本文整理自 CNCF x Alibaba 云原生技术公开课 第 21 讲 关注 阿里巴巴云原生 公众号 回复关键词 入门 即可下载从零入门 K8s 系列文章 PPT 导读 容器存储是 Kubernetes
  • 合天weekly 17~20 变量覆盖

    第十七周 给你扔了串代码 判断为POST提交 是否 POST flag 传参 然后利用foreach 函数遍历get和post传参并进行赋值 最后判断 POST flag flag 这里一定相等 不会成立 所以这里的die 403 不会执行
  • 【 华为OD机试 2023】新员工座位 / 统计友好度最大值(C++ Java JavaScript Python)

    华为od机试题库 华为OD机试2022 2023 C Java JS Py https blog csdn net banxia frontend category 12225173 html 华为OD机试2023最新题库 更新中 C Ja
  • 集成服饰SCM系统领猫连通更多应用

    场景描述 基于领猫开放API能力 无代码集成领猫连接多个应用 实现客户管理 款式管理 物料管理 合同管理 财务管理等 通过Aboter搭建业务自动化流程 实现多个应用的数据集成 接口能力 基础资料 研发管理 款式管理 订单管理 成品采购 外
  • Java中常量、变量及基本数据类型

    1 常量 在程序包运行过程中 固定不变的量 常量的分类 字符串常量 凡是用双引号引起来的部分 叫做字符串常量 两个双引号中间的呢绒可以为空 字符常量 凡是用单个引号引起来的单个字符 叫做字符常量 两个单引号中间必须有且只有一个字符 必能为空
  • 浏览器web播放rtsp视频流解决方案(chrome/IE/firefox/360等)

    代码中的具体参数含义 大家可以移步这里 https wiki videolan org Documentation WebPlugin 找半天 HTML5的可以支持RTMP 但是无法播放RTSP flash也止步于RTMP 最后同事推荐了个
  • 常用数据库连接URL地址大全

    转自 https www cnblogs com activiti p 6703478 html 1 Oracle8 8i 9i数据库 thin模式 Class forName oracle jdbc driver OracleDriver
  • 虚拟文件系统

    VFS的层次 文件系统实现与用户进程 或C库 之间 文件系统分类 基于磁盘的文件系统 ext2 3 fat iso9660 虚拟文件系统 proc 网络文件系统 nfs 通用文件模型 VFS提供一种结构模型 包含了一个强大的文件系统所应具备