手写文件系统一条龙篇

news2024/11/15 11:20:12

哈喽,我是子牙老师。这篇文章聊聊文件系统是怎么写出来的,看完,你就可以自己去写文件系统了。本文以Linux的EXT系列文件系统为例进行讲解,理解了,其他的文件系统你就可以自行研究了,差不多的东西

理解了本文,你就可以将持久化存储、机械硬盘、固态硬盘、PCIe、操作系统、文件系统、EXT、NTFS、FAT、文件IO、page cache……彻底吃透,在存储短赛道打下深厚的功底

什么是文件系统,这个不用我介绍了吧。具象的说,就是管理文件的一套系统。抽象的说,就是连接用户与持久化存储设备的桥梁。如下图
在这里插入图片描述

本文自下而上,会讲到:

  1. 一块主板最多能挂几块硬盘
  2. 如果要写代码操控硬盘,有几种方式,代码具体要怎么写
  3. 不同的文件系统,区别在哪里?同一种文件系统,是结构上有区别,还是算法上
  4. 如何理解磁盘分区结构
  5. 为什么第一个分区,都是从2048扇区开始
  6. EXT文件系统长啥样
  7. 磁盘分区、文件系统、块组之间是什么样的关系
  8. 文件、目录在文件系统中是如何存放的
  9. 一个分区最多支持多少个文件、目录
    ……

如果这些都是你想了解的,那太好了!如果有的是,有的不是,有的没想过,看看吧,技多不压身!

以下,enjoy

about硬盘

一块主板最多能挂几块硬盘呢?这个得看你的主板支持的硬盘接口类型。从古至今,硬盘接口类型有三种,现在主流的是PCIe接口,性能最高
在这里插入图片描述
在这里插入图片描述

如果我们想写代码操控硬盘,有哪些方式可用呢?对于操控硬件,一般有三种方式:BIOS中断、端口、内存映射。操控硬盘,可以用前两种方式:BIOS中断、端口,代码怎么写呢?

BIOS中断,代码这样写。如果写操作系统,这个只是在早期使用,当我们写的操作系统接管了中断,就不会去用BIOS中断了。而且BIOS中断功能也较弱,不能满足复杂的业务需求
在这里插入图片描述

主流的方式是用端口进行操作,代码这样写
在这里插入图片描述

至于代码为什么要这样写,我这里就不展开了。如果你想深入理解,可以去学习我的课程《手写64位多核操作系统》

我上面贴的代码都是同步机制操控硬盘,这个也是在操作系统内核早期,当操作系统内核接管了中断,实现了任务切换,就可以实现异步机制操控硬盘,这个也是当今科技世界操控硬件的主流方式

对了,硬盘的最小单位是扇区,sector,扇区的大小从512B、1K,到如今主流的4K,跟内存的物理页4K保持了一直。对于定位到某个扇区,硬盘提供了三种坐标方式:最早的是CHS,中间出现了一个过渡版本LBA28,如今主流的是LBA48

掌握了这些,你就可以去实现硬盘驱动了。实现文件系统的地基就有了,接着走

磁盘分区

拿到一块硬盘,一般会把它分成多个分区去使用
在这里插入图片描述

从古至今,磁盘分区结构有两种:MBR、GPT,现在主流的是GPT,我之前写文件系统用的是MBR,所以我就以MBR磁盘分区结构来讲了,大差不差,GPT只是在各个维度增强了而已,比如支持更多分区、每个分区能管理更大的磁盘空间

MBR磁盘分区结构的特点是:第一个扇区是MBR扇区,里面存放操作系统的boot代码+64B的磁盘分区信息;最多支持三个主分区+一个逻辑分区;逻辑分区中又可以支持主分区+逻辑分区,无限套娃
在这里插入图片描述

MBR磁盘分区信息在硬盘里长这样子,一般是在MBR扇区的末尾
在这里插入图片描述

是不是看不懂,没事,上c代码
在这里插入图片描述

分区信息里面有三个重要的东西:boot_ind告诉你这个分区是不是引导分区,就是是不是Windows的c盘,安装系统系统的盘。讲真,很多计算机方面的东西,Windows真的做的更人性化,比Linux

第二个就是start_sect,告诉你这个分区从哪个扇区开始。一般来说,第一个分区从2048开始,不是从2开始,为什么如此呢?
在这里插入图片描述

是不是看了等于没看,我当时看完也是这种感觉,于是我继续问,稍微好些
在这里插入图片描述

到这里,我们知道怎么去读写硬盘,知道MBR磁盘分区信息存储在哪,分区信息包含了我们写文件系统需要的信息,重要可以开始写文件系统了

EXT文件系统

操控硬盘、硬盘的第一个扇区为MBR扇区、磁盘分区信息,对于任何文件系统,都是一样的。那不同的文件系统,不一样的是什么呢?是文件系统结构

比如Windows的常用文件系统NTFS被设计成这样
在这里插入图片描述

比如Linux常用的EXT系列,被设计成这样。下面详细讲解EXT文件系统结构
在这里插入图片描述

硬盘的扇区大小从古至今经历了512B、1K,现在主流的4K。这张图描述的是1K年代,所以标注的引导块占1K,在4K为一个扇区的硬盘中,引导块占4K空间

块组是什么呢?块组是将分区进行分开管理,是EXT2引入的。其实块组针对以前的机械硬盘,效果显著,对于如今的固态硬盘,唯一的好处可能就是将大空间分块管理了
在这里插入图片描述

如何论证块组确实存在呢?通过命令查看
在这里插入图片描述
在这里插入图片描述

有没有注意到里面的数字:32767,而且每个块组好像都是32768个扇区,为什么这样呢?因为块位图只占一个扇区大小:4096*8=32768。言外之意就是一个块组最大只能管理32768个扇区

比如这个分区有327680个扇区,就会被分成10个块组进行关联。那块组信息如何存储呢?
在这里插入图片描述

10个ext4_group_desc存储在文件字体的块组描述符表中

超级块是干嘛的呢?是描述整个文件系统信息的,比如块组描述符表在哪个扇区、块位图在哪个扇区、数据从哪个扇区开始存、这个分区一共有多少扇区可用……其实挂载,就是将超级块读入内存,完成目录与分区的映射
在这里插入图片描述

inode是干嘛的,研究过文件系统的应该都知道吧,它记录了很多非常重要的信息,比如目录中所有的文件对应的信息,如果是文件,比如文件内存在哪些扇区中存储
在这里插入图片描述

一个块组支持多少inode呢?32768个,算法跟前面一样。那是不是一个块组最多只能创建32768个文件呢?不是。因为文件跟inode并不是一一对应的关系。比如硬链接, 多个文件指向同一个inode

EXT4文件系统中,inode描述的信息非常多,结构体占256B,贴一些让大家感受一下
在这里插入图片描述

那一个4K的扇区可以放多少inode呢?16个。那32768个inode需要多少4K扇区存储呢?2048个。记不记得前面提到过一个2048,跟这里可不是一个意思哦。

给大家留到题,检测你有没有看懂这篇文章:第一个分区的第一个块组的数据块,是从哪个扇区开始的?

后面准备做个课程《手写EXT4文件系统》,如果你感兴趣,可以持续关注文章动态。

到这里,基本就可以结束了。从上往下看,EXT4难不难?巨难!但从下往上看呢?好像也没那么难对吧!这就是学计算机的一个非常重要的学习思维,从下往上学!第一次透漏此精髓!你看到就是赚到了

大多数人,对于学底层,都是理论派、代码观战师,只有极少数的人,脚踏实地的去重复写轮子,证明、理解、开悟,你选择做哪种呢?纸上谈兵,还是真材实料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1942725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二证券:市场估值依然处于较低区域

结合风格板块、一级工作预喜情况与工作中预喜崎岖较大的企业体现看,估量2024年上半年中下游工作获利改善势头向好。其中,获益于客运量的上升,交通运输工作中大型蓝筹公司盈余才干改善。TMT领域中电子及通讯工作成果上升崎岖较大,工…

微服务分布式事务

1、分布式事务是什么? 微服务架构中的分布式事务是指在多个服务实例之间保持数据一致性的机制。由于微服务通常涉及将业务逻辑拆分成独立的服务,每个服务可能有自己的数据库,因此当一个业务操作需要跨多个服务进行时,确保所有服务…

小白速通 Spring 之 Annotation 篇

Annotation 注解 Service public class MessageServiceImpl implements MessageService{public String getMessage() {return "Hello World!";}} 本质上来说 Annotation(注解)是 Java 推出的一种注释机制,后面我们统一叫 Annotation,和普通的注释有个显…

Python设计模式:巧用元类创建单例模式!

✨ 内容: 今天我们来探讨一个高级且实用的Python概念——元类(Metaclasses)。元类是创建类的类,它们可以用来控制类的行为。通过本次练习,我们将学习如何使用元类来实现单例模式,确保某个类在整个程序中只…

python-首字母移位(PythonTip)

[题目描述] 编写一个程序,将句子中每个单词的首字母移位到下一个单词。定义函数shift_first_letter(),参数为sentence(字符串)。在函数内,将句子中每个单词的首字母移位到下一个单词。最后一个单词的首字母移位到句子的…

Hadoop架构

一、案列分析 1.1案例概述 现在已经进入了大数据(Big Data)时代,数以万计用户的互联网服务时时刻刻都在产生大量的交互,要处理的数据量实在是太大了,以传统的数据库技术等其他手段根本无法应对数据处理的实时性、有效性的需求。HDFS顺应时代…

【机器学习】模型验证曲线(Validation Curves)解析

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 模型验证曲线(Validation Curves)解析什么是模型验证曲线?模型验证曲线的解读模…

Django教程(004):基于orm操作数据库的用户管理实现

文章目录 1、功能需求2、展示用户列表2.1 添加url2.2 创建视图2.3 编写html页面 3、添加用户3.1 添加url3.2 跳转到添加页面3.3 编写添加用户页面3.4 添加用户3.5 实现效果3.6 页面优化 4、删除用户4.1 添加删除用户按钮4.2 添加删除url4.3 删除用户4.4 实现效果 5、完整代码链…

vue3使用html2canvas

安装 yarn add html2canvas 代码 <template><div class"container" ref"container"><div class"left"><img :src"logo" alt"" class"logo"><h2>Contractors pass/承包商通行证&l…

StableDiffusion模型推荐系列(风格型)

今天&#xff0c;分享几个SDXL的特殊风格模型&#xff0c;这些模型在特定风格下非常出彩&#xff0c;弥补了一些“我已经看腻了AI画图”的情况。这几位作者分享的SDXL模型艺术风格上表现得尤为出色&#xff0c;而且他们都是秉持着开源精神免费分享自己的模型。训练过模型的小伙…

掌握VR全景技术,需要具备哪些条件?

VR全景技术自从进入市场以来&#xff0c;就在各个行业领域尝试落地运用&#xff0c;包括但不限于广告宣传、学校教育、医疗、工业、农业等领域。随着5G 技术的不断普及&#xff0c;VR全景技术也逐渐被应用到日常生活中的各个方面&#xff0c;从地产中介到车企销售&#xff0c;从…

单周期CPU(三)译码模块(minisys)(verilog)(vivado)

timescale 1ns / 1ps //module Idecode32 (input reset,input clock,output [31:0] read_data_1, // 输出的第一操作数output [31:0] read_data_2, // 输出的第二操作数input [31:0] Instruction, // 取指单元来的指令input [31:0] …

ubuntu配置ssh服务器详解

① 确定Ubuntu是否安装SSH服务 systemctl status ssh 一般最开始都没有ssh服务 ② 安装SSH Server sudo apt install openssh-server 执行过程如下 ③ 确定Ubuntu SSH服务状态 systemctl status ssh 现在能看到&#xff1a; 第一行加载状态&#xff0c;已加载ssh.service文件…

大语言模型-GPT-Generative Pre-Training

一、背景信息&#xff1a; GPT是2018 年 6 月由OpenAI 提出的预训练语言模型。 GPT可以应用于复杂的NLP任务中&#xff0c;例如文章生成&#xff0c;代码生成&#xff0c;机器翻译&#xff0c;问答对话等。 GPT也采用两阶段的训练过程&#xff0c;第一阶段是无监督的方式来预训…

使用 Redis 实现验证码、token 的存储,用自定义拦截器完成用户认证、并使用双重拦截器解决 token 刷新的问题

基于session实现登录流程 1.发送验证码 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff0c;如果不合法&#xff0c;则要求用户重新输入手机号 如果手机号合法&#xff0c;后台此时生成对应的验证码&#xff0c;同时将验证码进行保存&#xff0c;然后再通过短信…

Python爬虫实战案例(爬取图片)

爬取图片的信息 爬取图片与爬取文本内容相似&#xff0c;只是需要加上图片的url&#xff0c;并且在查找图片位置的时候需要带上图片的属性。 这里选取了一个4K高清的壁纸网站&#xff08;彼岸壁纸https://pic.netbian.com&#xff09;进行爬取。 具体步骤如下&#xff1a; …

Android 性能之刷新率设置和管理

目录 1. 刷新率和帧率 2. 多种刷新率 3. 基本原理 3.1 屏幕 & 显示控制器 3.2 Composer Service 4. Framework 策略 4.1基本架构 4.2 刷新率设置项的定义 4.2.1 最低刷新率 4.2.2 默认刷新率 & 默认的用户设置刷新率 4.2.2.1 设置入口 4.2.2.2 设置场景 4…

Matlab画不同指标的对比图

目录 一、指标名字可修改 二、模型名字可修改 三、输入数据可修改 软件用的是Matlab R2024a。 clear,clc,close all figure1figure(1); % set(figure1,Position,[300,100,800,600],Color,[1 1 1]) axes1 axes(Parent,figure1);%% Initialize data points 一、指标名字可修…

zigbee DL-20无线串口模块(电赛备战)

zigbee DL-20无线串口模块(电赛备战) 备战2024电子设计大赛&#xff08;7.29-8.1&#xff09; 概述 DL-20是一款2.4G无线串口模块&#xff0c;支持点对点和广播模式的通信。它具备低数据丢失率、宽电压范围和高传输速率的特点&#xff0c;适用于多种无线通信场景。 在电赛中&…

百日筑基第二十八天-23种设计模式-行为型总汇

百日筑基第二十八天-23种设计模式-行为型总汇 文章目录 百日筑基第二十八天-23种设计模式-行为型总汇前言模板方法模式简介模板方式的特点模板方法模式结构类图模板方式模式案例分析模板方法模式应用源码分析模板方法模式的注意事项和细节 迭代器模式迭代器模式结构类图迭代器模…