Linux 0.11源码阅读笔记-文件管理

Linux 0.11源码阅读笔记-文件管理

文件系统

生磁盘

未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件。

磁盘分区

生磁盘可以被分区,分区中可以安装文件系统,常见的文件系统有fat32、ext2、ext4等。分区后的磁盘结构布局如下图,其中主引导扇区记录了分区信息,并且包含引导代码可用于引导操作系统。

Linux 0.11源码阅读笔记-文件管理

文件系统

分区内可以安装指定文件系统,同一磁盘多个分区文件系统不要求相同。MINIX文件系统布局如下:

Linux 0.11源码阅读笔记-文件管理
  • 启动块:如果是启动分区,则会存储操作系统的启动程序代码,否则为空。
    [En]

    Boot Block: if it is a boot partition, it will store the boot program code of the * operating system * , otherwise it will be left empty.*

  • 超级块:用于在磁盘设备上存储文件系统结构的信息,表示每个块的大小。
    [En]

    Super block: used to store the information of * file system structure * on the disk device, indicating the size of each part.*

  • i节点位图:标记i节点数据元素是否被使用
  • 逻辑块位图:标记是否使用磁盘块
    [En]

    logical block bitmap: marks whether disk blocks are used*

  • i节点区:用于存放inode节点数据,一个文件对应一个inode节点,inode节点存储文件属性数据。
  • 数据区:以固定大小盘块(1k)为单位进行动态分配和回收,用于存储数据,类似内存分页。

超级块

用于存储有关磁盘设备上的文件系统结构的信息,指示每个部分的大小。

[En]

Used to store information about the file system structure on the disk device, indicating the size of each part.

图中列出的数据由两部分组成:出现在磁盘和内存中的字段和仅在内存中使用的字段,以及仅在内存中使用的字段,这些字段是内核在读取管理用的超级块后附加的一些字段信息。

[En]

The data listed in the figure consists of two parts: the fields that appear on the disk and in memory and the fields that are used only in memory, and the fields used only in memory are some of the field information attached by the kernel after reading the superblock for administrative use.

Linux 0.11源码阅读笔记-文件管理

inode节点

inode节点保存对应文件的属性信息,其中i_zone数组使用类似多级页表的方式维护文件数据块,即记录文件逻辑块到物理块之间的映射关系。

Linux 0.11源码阅读笔记-文件管理

i_zone数组

i_zone数组包含直接盘块号、一次间接盘块号和二次间接盘块号。一次盘块号可视为单级页表,一次间接盘块号可视为二级页表、二次间接盘块号可视为三级页表。

这种方法的优点是,对于小文件,可以通过直接块号快速定位数据块;对于中等类型的文件,主要间接块可以维护更多的数据块,同时访问速度更快;对于大文件,次要间接块号可以维护大量的磁盘块,但访问速度较慢。

[En]

The advantage of this method is that for small files, data blocks can be quickly located by direct block numbers; for medium-type files, primary indirect blocks can maintain more data blocks while having faster access speed; for large files, secondary indirect block numbers can maintain a large number of disk blocks, but the access speed is slow.

内存多级页表与i_zone直接区别:不同进程具有固定大小的虚地址空间,并且对其整个虚地址空间的内存,都有可能访问到,因此使用多级页表。文件系统内存在很多大小不一的文件,综合考虑对不同大小文件的特点,使用1-3级磁盘块表可以分别处理小、中、大文件。

Linux 0.11源码阅读笔记-文件管理

目录结构

  1. 树形目录结构

文件系统目录结构为树,根节点为根目录,目录可以指向多个子目录或子文件。

[En]

The file system directory structure is a tree, the root node is the root directory, and the directory can point to several subdirectories or subfiles.

Linux 0.11源码阅读笔记-文件管理
  1. 文件查找过程

通过文件inode节点,可以定位文件数据块,那如何通过文件路径定位到具体文件?

文件系统主要包含文件和目录两种文件,目录是一种特殊的文件,其文件内容存储其目录下文件名->inode节点号的映射信息。文件查找开始于根目录,根目录号固定为0,不需要查找即可直接打开。

举例说明文件查找过程,给定存在路径 /name1/name2/name3查找具体文件过程:

1)通过根节点inode号,打开根目录,读取其文件内容,即目录下文件名->inode节点号映射表,找到name1目录inode节点号n1

2)通过name1的inode号n1,打开name1目录,读取其文件内容,即目录下文件名->inode节点号映射表,找到name1目录inode节点号n2

3)通过name2的inode号n2,打开name2目录,读取其文件内容,即目录下文件名->inode节点号映射表,找到name3目录inode节点号n3

4)通过name3的inode号n3,打开name3文件

  1. 文件数据块定位过程

1)打开文件:先通过文件查找找到文件inode节点号,然后打开文件,即读取inode至内存。

2)定位数据块:通过文件inode节点,访问其i_zone数组,进一步可以定位具体的数据所在磁盘块号。

Linux 0.11源码阅读笔记-文件管理

文件链接

  • 硬链接

硬链接,在指定目录文件中,生成一个文件,即建立 文件名->inode节点号的映射。不同之处在于,硬链接文件的inode号是其它文件的inode号,即多个文件共享一个inode。多个文件共享inode节点时,会引起inode节点引用计数增加。

硬链接示意图如下。

Linux 0.11源码阅读笔记-文件管理
  • 软链接(符号链接)

软链接,在指定目录文件中,生成一个文件,建立 文件名->文件路径的映射。软链接文件项不直接指向被指向文件的inode号,而是记录其文件路径。符号链接不直接共享inode,不会引起inode节点引用计数增加。

打开软链接文件时,首先获取它指向的文件路径,然后通过您指向的文件路径打开该文件。

[En]

When you open a soft-linked file, first get the file path it points to, and then open the file through the file path you point to.

软链接文件示意图如下,其中蓝线表示软链接。

[En]

The schematic diagram of the soft link file is as follows, where the blue line indicates the soft link.

Linux 0.11源码阅读笔记-文件管理
  • 删除被链接文件

硬链接:多个文件指向同一个inode节点,引用计数等于文件数量,删除其中一个文件,只会导致引用计数减小1,引用计数为零时,文件才会被删除。

软链接:删除软链接,对指向的文件没有影响;删除指向的文件,软链接可能无效。

[En]

Soft link: delete the soft link, it will not have any effect on the pointed file; delete the pointed file, the soft link may be invalid.

高速缓存

高速缓存是内核访问磁盘文件系统数据的必经之道,高速缓存用于解决CPU速度与磁盘IO速度不匹配的问题。因为CPU速度与磁盘IO速度差距较大,CPU同步读写磁盘数据,会导致CPU性能的浪费。

内核维护一个缓存池,该缓存池以块为单位使用和管理,可用于缓存磁盘数据并提高访问磁盘数据的性能。

[En]

The kernel maintains a cache pool that is used and managed on a block-by-block basis, which can be used to cache disk data and improve the performance of accessing disk data.

buffer.c文件包含实现高速缓冲区的程序。内核代码通过指定设备号和逻辑块号来调用块读写函数。这些接口函数有,bread()、breada()、bread_page()。

  • bread:块读取函数
  • breada:块提前预读函数
  • bread_page:页块读取函数,一个内存页通常为4k大小、磁盘块通常为1k大小

文件系统相关函数

文件系统底层函数

该部分函数用于处理文件系统的元数据,包括超级块、位图、inode节点等。该部分函数被内核其它部分代码调用,不是提供给用户代码调用的系统调用接口。

以下五个文件包括底层文件系统处理函数:

[En]

The underlying file system processing functions are included in the following five files:

  • bitmap.c:包含对i节点位图和逻辑块位图进行释放和占用处理函数,free_inode()、new_inode()、free_block()、new_block()
  • truncate.c:对数据文件长度截断为0的函数truncate(),可释放文件所有数据块。
  • inode.c:包含分配释放inode节点函数iget()和iput(),以及根据inode节点,获取文件逻辑块号函数bmap()。
  • namei.c:包含函数namei(),获取指定路径的inode节点
  • super.c:包的程序专门用于处理系统超级块,包括函数get_super()、free_super()等。还包括几个文件系统加载/卸载处理函数和系统调用,如sys_mount()等。

下图显示了文件系统不同部分对应的底层处理函数:

[En]

The following figure shows the underlying processing functions corresponding to different parts of the file system:

Linux 0.11源码阅读笔记-文件管理

文件中数据的访问操作

这部分函数用于处理文件的读写操作。

[En]

This part of the function is used to deal with the read and write operations of the file.

  1. 文件数据访问函数

用户程序调用read()、write()函数读写文件,read()、write()函数根据文件类型与其所在设备,进一步调用设备对应的读写函数如read_pipe()、write_pipe()等。

Linux 0.11源码阅读笔记-文件管理
  1. 打开文件使用的内核数据结构

内核使用文件结构file、文件表file_table[]和内存中的i节点表inode_table[]来管理对文件的操作访问。

  • 文件指针数组。进程使用一个文件指针数组管理打开的文件,其中的文件指针(下标号)指向文件表中对应的文件结构file。每个进程有自己的文件指针数组。
  • 文件表:表项为file数据,用于在文件句柄于内存i节点项之间建立关系,其包含文件类型、访问属性、读写指针、文件句柄引用计数等信息。因为不同进程可能使用不同的访问模式打开同一文件,并且需要单独的读写指针等数据。所有进程共享文件表(file_table)。
  • 内存i节点表:表项存储i节点信息,存储所有进程打开文件的i节点信息。所有进程共享内存i节点表。

思考:文件描述符指向file结构、file结构指向内存inode节点,允许存在多对一的情况。什么场景会存在多个文件描述符指向同一个file结构;什么场景存在多个file结构指向同一个内存inode节点。

open同一个文件:多个file数据指向同一inode节点

dul同一文件描述符:多个文件描述符指向同一文件表项—file数据。

fork进程:仅复制文件描述符表

内核数据结构

Linux 0.11源码阅读笔记-文件管理

file数据结构

Linux 0.11源码阅读笔记-文件管理

文件和目录管理系统调用

  • open.c:实现文件管理相关的系统调用。主要包括创建、打开、关闭和属性修改。
  • exec.c:实现对二进制可执行文件和shell脚本文件的加载与执行,其中主要的函数为do_execve(),是exec()函数簇的主要实现函数。
  • fcntl.c:实现文件系统控制调用fcntl()和文件描述符的复制系统调用dup()、dup2()。dup主要用于多个文件描述符指向同一file结构的场景。
  • ioctl.c:实现输入/输出控制系统调用ioctl。主要调用tty_ioctl()函数,对终端io进行控制。
  • stat.c:实现取文件状态信息系统调用stat()和fstat。

Linux 0.11源码阅读笔记-文件管理

总结

  1. MINIX文件系统空闲inode节点项和空闲磁盘块均通过位图管理,位图记录对应项是否空闲。
  2. 硬链接和软链接的区别在于,链接是直接指向inde节点,还是通过指向其他文件路径间接指向inode节点。
  3. linux内核具有io高速缓冲区,用于缓存磁盘数据,提高磁盘数据的访问效率。
  4. 打开文件内核数据结构具有三级映射关系:文件描述符->file数据->内存inode节点。open同一文件,多个file指向同一内存inode;dup文件描述符,多个文件描述符指向同一file。

Original: https://www.cnblogs.com/lazyfiish/p/16074696.html
Author: LazyFish
Title: Linux 0.11源码阅读笔记-文件管理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/523930/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • go-结构体内存布局

    方式一:通过 var 声明结构体 在 Go 语言中当一个变量被声明的时候,系统会自动初始化它的默认值,比如 int 被初始化为 0,指针为 nil。 var 声明同样也会为结构体类…

    Linux 2023年6月13日
    0102
  • shell多线程运行程序

    #!/bin/bash function my_cmd(){ sleep 1 } date tmp_fifofile="/tmp/$$.fifo" mkfifo…

    Linux 2023年6月6日
    0115
  • 微服务,【容器亚健康状态】问题,研究和解决

    —【前言】— 我问:”程序有『亚健康状态』吗?” 一个正常的人,应该这样回答:”什么?程序,亚健康。。。?你神经病吧?我…

    Linux 2023年6月14日
    088
  • 搭配色轮播(CSS进阶版本)

    html;gutter:true; Color</p> <pre><code> /* 自定义颜色 */ /* :root { */ /* –t…

    Linux 2023年6月13日
    079
  • 罗德岛

    自从转行以后就建博了,一直没有动手写内容,今天开始写。 主要记录技术上的积累和项目上的工作感悟。 这里就是罗德岛,就在这里跳。 Original: https://www.cnbl…

    Linux 2023年6月6日
    090
  • 【小记】pip 如何下载 whl 环境到无外网机器

    你的测试机肯定是有外网,脚本肯定也能在测试机跑通。 先导出 whl 包列表到txt: 然后执行下载到当前目录: 将 whl 拷贝到内网服务器安装即可。(Win和Linux编译不互通…

    Linux 2023年6月13日
    0104
  • LINUX系统虚拟机环境的安装

    安装VM和Centos Step 1 去BIOS里修改设置开启虚拟化设备支持 设置BIOS: 1.开机按F2 、F12 、DEL 、ESC 等进入BIOS ,一般来说可以看屏幕的左…

    Linux 2023年6月7日
    084
  • 增加Apache响应时间

    在apache的配置文件 httpd.conf 最下面加上下面代码,增加响应时间 FcgidProcessLifeTime 8200 FcgidIOTimeout 8200 Fcg…

    Linux 2023年6月7日
    0101
  • HTTPS 通信过程

    posted @2021-11-26 21:23 HOsystem 阅读(27 ) 评论() 编辑 Original: https://www.cnblogs.com/HOsyst…

    Linux 2023年6月13日
    0153
  • 小记:音频格式转化ByPython(下)

    上文中我们已经大致明白了pydub库的使用方法,今天的目标是写个爬虫爬取歌曲信息。 关于网络爬虫,Python的标准库里是有相应的包的,可以直接打开:https://docs.py…

    Linux 2023年6月8日
    0116
  • Common LISP 命令大全

    书籍下载地址: Ansi Common Lisp 中文版|百度网盘 实用Common.Lisp编程 .pdf|百度网盘 LISP指令速查网站推荐: Simplified Commo…

    Linux 2023年6月6日
    0123
  • python之pyautogui实现图片识别-办公自动化

    环境 python 3.8everedit编辑器 代码 from selenium import webdriver from selenium.webdriver.chrome….

    Linux 2023年6月7日
    0116
  • Spring中毒太深,离开了Spring,我居然连最基本的接口都不会写了¯_(ツ)_/¯

    前言 众所周知,Java必学的框架其中就是SSM,Spring已经融入了每个开发人员的生活,成为了不可或缺的一份子。 随着 Spring 的崛起以及其功能的完善,现在可能绝大部分项…

    Linux 2023年6月13日
    084
  • Linux嵌套目录权限的比较探究

    在/tmp目录下新建一个嵌套目录,名字分别为test_0、test_1、test_2。在test_2目录下新建普通文件,名为tryme。设置test_0和test_2的权限为777…

    Linux 2023年6月7日
    087
  • 20191223-Exp3-免杀原理

    Exp3-免杀原理 姓名:张俊怡 学号:20191223 课程:网络对抗技术 一、实践内容 方法 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加…

    Linux 2023年6月8日
    0131
  • python的日期处理

    俗话说,工欲善其事必先利其器,所以在使用日期前要先对日期进行处理,所以时间戳和字符串的来回来去转换这个事肯定是要搞的 这次的函数有一个?有两个?有三个?有四个!上代码! 哈哈,像不…

    Linux 2023年6月6日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球