首页 > 系统相关 >虚拟文件系统 - Linux Kernel Development阅读笔记

虚拟文件系统 - Linux Kernel Development阅读笔记

时间:2022-10-30 19:12:02浏览次数:75  
标签:Development Kernel dentry 文件 对象 VFS 文件系统 Linux inode

Linux将访问文件系统的接口统一为虚拟文件系统(VFS)接口,消除了文件系统间和硬件存储介质之间的差异。

write() -> sys_write() -> filesystem's write method -> physical media

Unix 文件系统

四个基础概念:files, directory entries(dentry), inode和mount point。

一个全局的层级架构作为namespace,文件系统可以挂载在这个层级架构的任何一个位置上。这使得所有的文件系统最后都成为一棵树上的条目,它们所在的位置称为挂载点(mount point)。在这一点上和Windows系统以驱动器号(C盘、D盘...)作为一个个namespace的边界明显不同。

文件(file)是一串有序字节。文件信息(metadata,如文件权限、文件名)和文件本身分开,单独存放在一个结构体中,称为inode

文件存放在目录中,目录中也可以存放目录,不同层级的目录和最后一级的文件名可以共同构成一条路径(path),而路径中的每个部分则称为目录项(dentry)。例如,/home/wolfman/butter是一个指向butter文件的路径,其中的/、home、wolfman、butter都是dentry。

文件系统本身的控制信息存放在superblock中。

Linux系统的VFS基于上面这些概念运行,即使如一些非Unix文件系统本身并不支持这些概念,它们在Unix上运行时也需要在内存中单独实现这些概念和结构。

VFS对象和它们的结构体

上面四个概念在VFS中实现为对应的四个对象(object)。

  • 需要注意的是,VFS将目录(directory)当作一般文件处理,dentry≠directory,二者是两个不相关的概念。

每种对象有自己的操作符对象xxxx_operations。

  • 尽管Linux所使用的C语言不支持面向对象特性(即操作符明明是对象实例的成员(object->object_operations),但却并不能轻易获得自己所在实例的信息),但是这个概念仍然是可实现的,只是需要手动向操作符传递实例信息,例如sb->s_op->write_super(sb)。

Superblock 对象

superblock对象由每个文件系统实现,用来存放描述自身的信息。

superblock通常位于磁盘的某个特定位置上。对于不基于磁盘的文件系统,例如虚拟内存文件系统,superblock通常实时生成,并存放在内存里。

Inode 对象

inode对象用于描述某个文件或目录的所有信息。

对于Unix风格的文件系统,inode通常从磁盘直接读取到内存中。没有inode概念的文件系统通常在内存中建立inode对象,用它们自己所支持的方式填充inode结构体中的信息。

Dentry 对象

dentry是一条路径(path)中的某个组成部分,既可以是目录,也可以是文件。

  • 解析一条路径是一个需要耗费时间的工作,并且有些操作需要基于目录进行(例如查找路径名,确认路径是否可用),所以VFS提出了dentry的概念,来缩短这些工作的处理时间。

dentry在VFS需要进行目录操作的时候实时生成,所以和前两者不同,磁盘上并没有数据结构体对应它。

dentry有三个状态:used、unused和negative。

  • used:dentry对应一个可用的inode,并且自身正在被多个用户使用。
  • unused:dentry对应一个可用inode,但自身没有被任何用户使用。
  • negative:dentry没有对应可用inode,例如目录名实际不存在。
    三种情况的dentry都位于内存slab object cache,可以被释放。

生成和使用过的dentry会被内核存放在内存的dentry cache(dcache)中,dcache由三个部分组成:

  • used dentry列表
  • unused dentry和negative dentry的最近最少使用(LRU)列表,当内存不足时从队尾丢弃dentry
  • 用于快速解析path到dentry的哈希表
    此外,dcache还提供了icache接口,用于存放dcache中dentry所对应的inode。这样当path成功在cache中找到dentry时,dentry对应的inode也一定在cache中。

File 对象

file对象用于表示一个进程打开的文件。当我们从用户空间的视角看VFS时,会发现每个进程所处理的对象并不是superblock、inode或dentry,而是一个个文件。

file对象是某个打开了的文件在内存中的表示形式,它由open()系统调用创建,由close()系统调用释放。由于一个文件可以同时被多个进程打开和操作,所以一个文件可能在内存中对应多个file对象。

文件系统特有数据结构

Linux支持大量的文件系统,而每种文件系统又有自己特有的能力,这时候需要一个特殊的结构体来描述这些信息,即file_system_type结构体。

一种文件系统只有一个file_system_type结构体,不管它在系统中有多少个实例。

当文件系统被挂载时,相当于文件系统创建了一个实例。此时会创建vfsmount结构体,存放它作为一个实例的具体信息,例如挂载标志(mnt_flag)。

进程特有数据结构

每个进程有自己的打开文件、根文件系统和当前工作目录等。其中有三个数据结构和VFS相绑定,files_struct、fs_struct和namespace。

标签:Development,Kernel,dentry,文件,对象,VFS,文件系统,Linux,inode
From: https://www.cnblogs.com/namiya/p/16841812.html

相关文章

  • linux 中实现将fasta文件的碱基数目转换为指定的个数
     001、每行输出为4个碱基[root@pc1test]#lstest.fa[root@pc1test]#cattest.fa>chr1aattcctt>chr2ttggaacc>chr3TTCCGG[root@pc1test]#awk'{if($0~......
  • linux 安装软件学习
    1.适合小白Linux的第三节Linux软件安装适合小白Linux的第三节Linux软件安装_哔哩哔哩_bilibili2.Linux源码安装步骤Linux源码安装步骤-南极山-博客园(cnblogs.com)......
  • Linux Must-Learnt Commands
    Clearsuccessfulloginhistory:echo>/var/log/wtmpViewloginhistory:lastClearcommand'sinputhistory:history-c#temperarllysudoaptinstall-ywipewipe~/.......
  • Linux 测网速
    speedtest-cli是一个用Python编写的轻量级Linux命令行工具,在Python2.4至3.6版本下均可运行。它基于speedtest.net的基础架构来测量网络的上/下行速率。下载:gitclonehttps:......
  • linux 内核的启动过程
           ......
  • 18.Linux系统总结
    Linux基础操作系统操作系统 OperatingSystem 简称 OS ,是软件的一部分,它是硬件基础上的第一层软件,是硬件和其它软件沟通的桥梁。操作系统会控制其他程序运行,管......
  • Linux shell编程
    建立文件:第一行#!/bin/bash标识该Shell脚本由哪个Shell解释:#!/bin/bashecho"HelloWorld!"shell中的变量:shell中的变量⑴常用系统变量$#:保存程序......
  • 《Unix&Linux系统编程》第六章学习笔记
    第6章信号和信号处理6.1信号和中断中断是从I/O设备或协处理器发送到CPU的外部请求,将CPU从正常执行转移到中断处理。信号是发送给进程的请求,将进程从正常执行转移到中断......
  • 《Unix/Linux系统编程》第六章学习笔记
    第6章信号和信号处理摘要本章讲述了信号和信号处理;介绍了信号和中断的统一处理,有助于从正确的角度看待信号;将信号视为进程中断,将进程从正常执行转移到信号处理;解释了信......
  • windows 2003 oracle 10.2.0.4 升级迁移到linux 11.2.0.4
    文档课题:windows2003oracle10.2.0.4升级迁移到linux11.2.0.4源端:windows200332位+oracle10.2.0.432位+双实例目标端:centos7.964位+oracle11.2.0.464位应......