linuxkernel文件系统概述

linuxkernel⽂件系统概述
1 概述
在Linux系统中,⼀切皆⽂件,除了通常所说的狭义的⽂件(⽂本⽂件和⼆进制⽂件)以外;⽬录,设备,套接字和管道等都是⽂件.
1.1 ⽤户空间层⾯
应⽤程序可以直接使⽤内核提供的系统调⽤访问⽂件.
(1)⼀个存储设备上的⽂件系统,只有挂载到内存中⽬录树的某个⽬录下,进程才能访问这个⽂件系统.系统调⽤mount⽤来把⽂件系统挂载到内存中⽬录树的某个⽬录下.
(2)系统调⽤umount⽤来卸载某个⽬录下挂载的⽂件系统.
(3)使⽤open打开⽂件.
(4)使⽤close关闭⽂件.
(5)使⽤read读⽂件.
(6)使⽤write写⽂件.
(7)使⽤lseek设备⽂件偏移.
(8)当我们写⽂件的时候,内核的⽂件系统模块把数据保存到页缓存中,不会⽴即写到存储设备.我们可以使⽤fsync把⽂件修改过的属性和数据⽴即写到存储设备,或者使⽤fdatasync把⽂件修改过得数据⽴即写到存储设备.
应⽤程序也可以使⽤glibc库封装的标准I/O流函数访问⽂件,标准I/O流提供了缓冲区,⽬的是尽可能减少调⽤read和write的次数,提⾼性能.
(1)fopen打开⽂件流.
(2)fclose关闭流.
(3)fread读流.
(4)fwrite写流.
(5)fseek设置⽂件偏移.
(6)fwrite可以把数据写到⽤户空间缓冲区,但不会⽴即写到内核.可以使⽤fflush冲刷流,即把写到⽤户空间缓冲区的数据⽴即写到内核.
1.2 硬件层⾯
外部存储设备分为块设备,闪存和NVIDIMM设备3类.
块设备主要有以下两种:
智能水刀
(1)机械硬盘:机械硬盘的读写单位是扇区.
(2)闪存类块设备:使⽤闪存作为存储介质,⾥⾯的控制器运⾏固化的驱动程序,驱动程序的功能之⼀是闪存转换层,把闪存转换为块设备,对外表现为块设备.
闪存类块设备相对机械硬盘的优势是:访问速度块,因为没有机械操作;抗振性很⾼,便于携带.
闪存按存储结构分为NAND闪存和NOR闪存,NOR闪存适合存储程序,⼀般⽤来存储引导程序,⽐如U-Boot程序;NAND闪存适合存储数据.
(3)NVDIMM:⾮易失性内存,设备把NAND闪存,内存和超级电容集成到⼀起,访问速度和内存⼀样快,并且断电之后数据不会丢失.
1.3 内核空间层⾯
在内核的⽬录fs下可以看到,内核⽀持多种⽂件系统类型.为了对⽤户程序提供统⼀的⽂件操作接⼝,为了使不同的⽂件系统实现能够共存,内核实现了⼀个抽象层,称为虚拟⽂件系统.
⽂件系统分为以下4种:一体化机芯
(1)块设备⽂件系统,存储设备是机械硬盘和固态硬盘等块设备,常见的块设备⽂件系统是EXT和btrfs.
(2)闪存⽂件系统,存储设备是NAND闪存和NOR闪存,常⽤的闪存⽂件系统是JFFS2和UBIFS.
(3)内存⽂件系统,⽂件在内存中,断电后⽂件丢失,常⽤的内存⽂件系统是tmpfs,⽤来创建临时⽂件.
(4)伪⽂件系统,是假的⽂件系统,只是为了使⽤虚拟⽂件系统的编程接⼝,常⽤的伪⽂件系统如:sockfs,proc,sysfs,hugetlbfs,cgroup,cgroup2.
访问外部存储设备的速度很慢,为了避免每次读写⽂件时,访问外部存储设备,⽂件系统模块为每个⽂件在内存中创建了⼀个缓存,因为缓存的单位是页,所以称为页缓存. 块设备的访问单位是块,块⼤⼩是扇区⼤⼩的整数倍.内核为所有块设备实现了统⼀的块设备层.为了避免每次读写都需要访问块设备,内核实现了块缓存,为每个块设备在内存中创建⼀个块缓存.缓存的单位是块,基于页缓存实现的.
每种块设备需要实现⾃⼰的驱动.
陶粒砂过滤内核把闪存称为存储技术设备(MTD),为了所有闪存实现了统⼀的MTD层,每种闪存需要实现⾃⼰的驱动程序.
针对NVDIMM设备,⽂件系统需要实现DAX(Direct Access,直接访问),绕过页缓存和块设备层,把NVDIMM设备⾥⾯的内存直接映射到进程或内核的虚拟地址空间.
热风锅炉2 虚拟⽂件系统的数据结构
虽然不同⽂件系统类型的物理结构不同,但是虚拟⽂件系统定义了⼀套统⼀的数据结构.
(1)超级块,⽂件系统的第⼀块就是超级块,描述⽂件系统的总体信息,挂载⽂件系统的时候在内存中创建超级块的副本:结构体super_block;
(2)虚拟⽂件系统在内存中把⽬录组织为⼀棵树.⼀个⽂件系统,只有挂载到内核中⽬录树的⼀个⽬录下,进程才能访问这个⽂件系统.每次挂载⽂件系统,虚拟⽂件系统就会创建⼀个挂载描述符mount,并且读取⽂件系统的超级块,在内存中创建⼀个副本.
(3)每种⽂件系统的超级块的格式不同,需要向虚拟⽂件系统注册⽂件系统类型file_system_type.并且实现mount⽅法⽤来读取和解析超级块.
(4)索引节点,每个⽂件对应⼀个索引节点,每个索引节点有⼀个唯⼀的编号.当内核访问存储设备上的⼀个⽂件时,会在内存中创建⼀个索引节点的副本:结构体inode.
(5)⽬录项,⽂件系统把⽬录看作⽂件的⼀种类型,⽬录的数据是由⽬录项组成的,每个⽬录项存储⼀个⼦⽬录或⽂件的名称以及对应的索引节点号.当内核访问存储设备上的⼀个⽬录项时,会在内存中创建该⽬录项的⼀个副本:结构体dentry.
(6)当进程打开⼀个⽂件的时候,虚拟⽂件系统就会创建⽂件的⼀个打开实例file结构体,然后在进程的打开⽂件表中分配⼀个索引,这个索引称为⽂件描述符,最后把⽂件描述符和file结构体的映射添加到打开⽂件表中.
2.1 超级块雨棚梁
⽂件系统的第⼀块是超级块,⽤来描述⽂件系统的总体信息.当我们把⽂件系统挂载到内存中⽬录树的⼀个⽬录下时,就会读取⽂件系统的超级块,在内存中创建超级块的副本:结构体super_block,主要成员如下:
压力检测装置

本文发布于:2024-09-22 14:18:56,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/270255.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:系统   设备   闪存   内核
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议