Linux0.11中MINIX 文件系统

阅读linux 的源码的时候对minix 文件系统有很多的疑惑,根据自己的认识将这些做一个总结。

MINIX 文件系统由六个部分组成,分别是引导块,超级块,i结点位图,逻辑块位图,i结点,数据块。

 引导块:上电由计算机BIOS读取的部分,格式固定,所有的盘都包含这个部分,不作为启动盘的磁盘引导块内容为0。

超级块:存放盘设备上文件系统的结构信息,并说明各个部分的大小。

struct d_super_block {unsigned short s_ninodes;unsigned short s_nzones;unsigned short s_imap_blocks;unsigned short s_zmap_blocks;unsigned short s_firstdatazone;unsigned short s_log_zone_size;unsigned long s_max_size;unsigned short s_magic;
};

i结点位图:说明i结点的使用情况,每一位代表一个i结点。

逻辑块位图:说明数据盘块的使用情况,每一位表示一个数据块的使用情况。

i结点:存储结点信息,32个自己存储一个i结点

struct d_inode {unsigned short i_mode;unsigned short i_uid;unsigned long i_size;unsigned long i_time;unsigned char i_gid;unsigned char i_nlinks;unsigned short i_zone[9];
};

数据块:存储文件的目录或者文件的内容

通过一个实际的例子来认识MINIX文件系统的结构:

1:使用指令dd if=/dev/zero of=minix.img bs=1k count=360 生成一个文件

2:将文件格式化成为minix 格式的文件系统 mkfs.minix -1 minix.img

从中可以看到有128 个i结点,总共有360个块,数据区从第8个块开始。使用指令hexdump -C minix.img可以查看文件系统的二进制格式

上图的第二个红色框内就是超级块的内容,我们来解析一下相关的部分:

struct d_super_block {unsigned short s_ninodes;      //0x0080,十进制128,inode总共128个unsigned short s_nzones;       //0x0168,十进制360,总共360个zoneunsigned short s_imap_blocks;  //0x0001,十进制1,inode位图占1个块unsigned short s_zmap_blocks;  //0x0001,十进制1,zone位图占1个块unsigned short s_firstdatazone;//0x0008,十进制8,第一个数据区编号是8unsigned short s_log_zone_size;//0x0000,log表示的一块数据大小,1kbunsigned long s_max_size;      //0x10081c00,十进制268966912,最大文件长度unsigned short s_magic;        //0x138f,minix魔数
};

 i节点位图数据

再来看i结点位图部分:从超级块中看到有128个i结点,那么可以算出来需要128/8 =16个byte 的数据来管理i结点。128 个bit 位来表示128个i结点,但是由于第一个bit 位不使用,并且被设置为1(0x3=00000011),所有后的第17个字节的fe 贡献出来一个bit (0xfe=11111110).从这个数据来看i结点被使用了一个,0x3=00000011,红色的1表示第一个i结点被使用。从图中可以看出第一个i结点中数据部分不是0,有相关的内容。

再来看i结点的数据内容 :

根据数据结构解析内容: 

struct d_inode {unsigned short i_mode; //0x41ed,040755, 目录文件, rwxr-xr-xunsigned short i_uid;  //0x03e8unsigned long i_size;  //0x00000040unsigned long i_time;  //0x663c6817unsigned char i_gid;   //0xe8unsigned char i_nlinks; //0x02unsigned short i_zone[9]; //{0x0008,0x0000重复8次}
};

从中可以看到size 是0x40 有64个byte ,原因是文件系统有“.”和“..”两个目录项。从数据块中可以看到2e是“.”的ASSIC 码表示。

在文件系统中,. 和 .. 有特殊的含义,尤其在 UNIX 和 Linux 系统中。

  1. .(点):

    • 表示当前目录。当你在一个目录中执行操作或引用文件时,. 用来指代当前目录。例如,./my_textfile 表示当前目录下的名为 my_textfile 的文件。
    • 在文件路径中,. 也常常用于表示相对路径的起始位置。
  2. ..(点点):

    • 表示当前目录的上一级目录,即父目录。当你想要访问上一级目录中的文件或目录时,可以使用 ..。例如,../my_runfile 表示上一级目录下的名为 my_runfile 的文件。
    • 在文件系统的根目录中,.. 和 . 是相同的,因为根目录没有父目录。

这两个特殊标记在 UNIX 和 Linux 系统中非常常见,用于方便地导航和引用文件系统中的文件和目录。它们也用于文件路径的构造,使得用户可以使用相对路径而不是绝对路径来引用文件。

再来看逻辑块位图部分:有44个byte ,44x8=352个数据块。1个引导块,1个超级块,1个i结点位图块,1个逻辑位图块,4个i节点块(128x32=4096,需要4k的数据存储i结点,所以有4个i节点块),总的块数是360. 首位不用置为1,最后的0xfe补一个bit位。

目前我们的文件系统中是一个空的,只有“.”和“..”两个默认的目录项,我们在PC上挂载文件系统,然后新建一个dir 文件夹,再在里面新建一个文件看看MINIX各个部分的变化情况。通过指令sudo mount minix.img -o loop mnt来挂载文件系统。

从图中看出,除了超级块和,引导块其它部分都有变化。i结点位图第一个byte 从0x3变成了0x17(00010111),从中可以看出有三个i结点被使用,分别是第一个,第二个和第四个。逻辑块位图的第一个byte从0x3变成了0x0f(00001111)第一个,第二个,第三个数据块被使用了。i结点部分

0x1000~0x101F,0x1020~0x103F,0x1060~0x107F这几个地址中存储的是3个i结点。分别对应于0x0008,0x0009,0x000a这三个块。第一个是根目录的i结点,通过它可以找到根目录下的文件目录内容。

找到内容“.”,“..”和“dir”。可以看到dir 在的i节点号是0x0002.

从2号i结点中我们找到dir 内容,首先确认2号结点存储的数据在9号数据块中

然后从9x1024=0x2400这个地址的起始位,长度是0x80

里面记录了一些内容:02 00 2e 表示“.”在2号结点。01 00 2e 2e 表示“..”在1号结点,04 00 74 65 73 74 2e 74  78 74 对应4号结点的test.txt文件,我们再通过4号结点查找文件的内容。

文件内容在第0xa个数据块处,10x1024 = 0x2800处,长度是0x00000007个字节。

找到文件的内容31 32 33 34 35 0a 0a 。

回顾整个过程./dir/test.txt,这个文件我们是怎么找到它的内容的,首先在利用根目录的i结点找到根目录下的所有目录项,然后从中找到dir 的i结点号,然后通过dir的i结点号找到下面的所有目录项,然后找到test.txt的i结点号,然后找到文件中的内容。

本文简单总结了MINIX 文件系统的数据结构,是大家在学习linux内核文件系统的时候有一个基本的了解,详细的介绍可以看看《linux内核完全注释》这本书的第九章。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构的堆(c语言版)

一.堆的概念 1.堆的基本概念 在计算机科学中,堆是一种特殊的数据结构,通常用于实现优先队列和动态分配内存。 2.堆的特征 堆是一个完全二叉树,它具有以下两个主要特性: 堆序性:对于最大堆,在堆中的任意节…

wpf转换器

WPF(Windows Presentation Foundation)中的转换器主要是指IValueConverter接口的实现,它用于在数据绑定过程中转换源数据和目标数据的类型或表示形式。这种机制使得开发者能够灵活地处理数据,特别是在用户界面(UI&…

VMP 简单源码分析(.net)

虚拟机 获取CPU的型号 实现了一个指令集解释器,每个操作码对应一个特定的处理函数,用于执行相应的指令操作。在执行字节码时,解释器会根据操作码查找并调用相应的处理函数来执行指令。 截获异常 先由虚拟机处理 处理不了再抛出异常 priva…

基于Springboot的校园疫情防控系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的校园疫情防控系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

【可实战】被测需求理解(需求文档是啥样的、从哪些角度进行需求评审、需求分析需要分析出哪些内容、如何提高需求分析能力)

产品人员会产出一个需求文档,然后组织一个需求的宣讲。测试人员的任务就是在需求宣讲当中,分析需求有没有存在一些问题,然后在需求宣讲结束之后通过分析需求文档,分析里面的测试点并预估一个排期。 一、需求文档是什么样的&#x…

我独自升级崛起怎么下载 游戏下载教程分享

《我独自升级:崛起》这款游戏核心聚焦于激烈的战斗与角色的持续成长。新加入的玩家首要任务是熟悉基础攻击模式,随后深入探索技能组合策略与连贯招式的艺术,同时掌握防守与躲避技巧,这些都是战斗中不可或缺的关键。随着战斗的持续…

python turtle 升国旗

​一、导语 大家好,前段时间,我们画出了五星红旗,今天我们要用Python的Turtle库来绘制一个五星红旗,并让国旗上升,让我们一起来感受编程与艺术的完美结合吧!领略国家的强大!爱祖国,做一个遵纪守法的好公民。 二、效果展示 升国旗 三、开发过程 一、准备工作 首先我们…

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习 1、 for i in range(6):Spaceship.step(Item[i].x - Spaceship.x)Dev.step(Item[i].y - Dev.y)Dev.step(Spaceship.y - Dev.y)2、 for i in range(5):Spaceship.step(Item[i].x - Spaceship.x)Flyer[i].step(Item[…

7.基于麻雀搜索算法(SSA)优化VMD参数(SSA-VMD)

01.智能优化算法优化VMD参数的使用说明 02.基本原理 麻雀搜索算法(SSA)是一种基于鸟类觅食行为的启发式优化算法,它模拟了麻雀在觅食时的群体行为,通过模拟麻雀的觅食过程来寻找问题的最优解。SSA的基本原理是通过模拟麻雀的搜索…

PyCharm 2024新版图文安装教程(python环境搭建+PyCharm安装+运行测试+汉化+背景图设置)

名人说:一点浩然气,千里快哉风。—— 苏轼《水调歌头》 创作者:Code_流苏(CSDN) 目录 一、Python环境搭建二、PyCharm下载及安装三、解释器配置及项目测试四、PyCharm汉化五、背景图设置 很高兴你打开了这篇博客,如有疑问&#x…

已经有 Prometheus 了,还需要夜莺?

谈起当下监控,Prometheus 无疑是最火的项目,如果只是监控机器、网络设备,Zabbix 尚可一战,如果既要监控设备又要监控应用程序、Kubernetes 等基础设施,Prometheus 就是最佳选择。甚至有些开源项目,已经内置…

【用文本生成歌声】Learn2Sing 2.0——歌声转换算法即梅尔频谱详解

一. 频谱图与梅尔谱图的介绍 频谱图:频谱图可以理解为一堆垂直堆叠在一起的快速傅里叶变换结果。 1.1 信号 在进入频谱图模块之前,首先我们需要了解信号是什么。 信号就是某一特定量随时间变化,对于音频来说,这个特定的变化量就…

搜维尔科技:OptiTrack是基于LED墙虚拟制作舞台的最佳选择

OptiTrack因其绝对精度、易用性、可靠性以及与现场工具的完美集成而被选中&#xff0c;仍然是全球首屈一指的基于 LED 墙的虚拟制作舞台的选择。 当今虚拟制作阶段的低延迟、超精确摄像机跟踪标准 /- 0.2 毫米 位置精度1 < 10 毫秒 系统延迟 /- 0.1 度 旋转精度2 电影…

流畅的python-学习笔记_符合python风格的对象

对象表示形式 查看对象说明&#xff0c;可以通过__repr__和__str__方法&#xff0c;前者主要用于开发者&#xff0c;后者主要用于用户&#xff0c;这两个方法分别对内置函数repr和str函数提供支持 向量类 备选构造方法 classmethod和staticmethod staticmethod用的不是特别…

加速科技突破2.7G高速数据接口测试技术

随着显示面板分辨率的不断提升&#xff0c;显示驱动芯片&#xff08;DDIC&#xff09;的数据接口传输速率越来越高&#xff0c;MIPI、LVDS/mLVDS、HDMI等高速数据接口在DDIC上广泛应用。为满足高速数据接口的ATE测试需求&#xff0c;作为国内少数拥有完全自研的LCD Driver测试解…

深入剖析Tomcat(六) Tomcat各组件的生命周期控制

Catalina中有很多组件&#xff0c;像上一章提到的四种容器&#xff0c;载入器&#xff0c;映射器等都是一种组件。每个组件在对外提供服务之前都需要有个启动过程&#xff1b;组件在销毁之前&#xff0c;也需要有个关闭过程&#xff1b;例如servlet容器关闭时&#xff0c;需要调…

红米1s 刷入魔趣 (Mokee)ROM(Android 7.1)

目录 背景准备工具硬件&#xff08;自己准备&#xff09;软件&#xff08;我会在文末提供链接&#xff09; 刷机步骤1. 重启电脑2. 安装驱动3. 刷入TWRP4. 清空数据5. 刷入魔趣6. 开机 结尾下载链接 本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 B…

汇集全球顶级AI的自助平台

1、介绍:此平台以其开放和便捷的特性,为用户提供了一个无需月费的 AI 服务入口。咱可以根据自己的需求,灵活选择和付费使用平台上的 AI 技术。 该平台强调的核心优势在于 “零门槛” 和 “按需付费”,意味着用户不需要进行大额预付或者承担长期的固定费用,而是可以根据实际…

Kubernetes的基本概念

目录 一.基本内容 1.定义 2.作用 二.特性 1.弹性伸缩 2.自我修复 3.服务发现和负载均衡 4.自动发布&#xff08;默认滚动发布模式&#xff09;和回滚 5.集中化配置管理和密钥管理 6.存储编排&#xff0c;支持外挂存储并对外挂存储资源进行编排 7.任务批处理运行 三…

【go项目01_学习记录08】

学习记录 1 模板文件1.1 articlesStoreHandler() 使用模板文件1.2 统一模板 1 模板文件 重构 articlesCreateHandler() 和 articlesStoreHandler() 函数&#xff0c;将 HTML 抽离并放置于独立的模板文件中。 1.1 articlesStoreHandler() 使用模板文件 . . . func articlesSt…