Linux0.11中MINIX 文件系统

news2024/11/20 22:42:21

阅读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个zone
    unsigned short s_imap_blocks;  //0x0001,十进制1,inode位图占1个块
    unsigned short s_zmap_blocks;  //0x0001,十进制1,zone位图占1个块
    unsigned short s_firstdatazone;//0x0008,十进制8,第一个数据区编号是8
    unsigned short s_log_zone_size;//0x0000,log表示的一块数据大小,1kb
    unsigned 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-x
	unsigned short i_uid;  //0x03e8
	unsigned long i_size;  //0x00000040
	unsigned long i_time;  //0x663c6817
	unsigned char i_gid;   //0xe8
	unsigned char i_nlinks; //0x02
	unsigned 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.coloradmin.cn/o/1656968.html

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

相关文章

面试集中营—Redis架构篇

一、Redis到底是多线程还是单线程 1、redis6.0版本之前的单线程,是指网络请求I/O与数据的读写是由一个线程完成的; 2、redis6.0版本升级成了多线程,指的是在网络请求I/O阶段应用的多线程技术;而键值对的读写还是由单线程完成的。所…

每日Attention学习6——Context Aggregation Module

模块出处 [link] [code] [IJCAI 22] Boundary-Guided Camouflaged Object Detection 模块名称 Context Aggregation Module (CAM) 模块作用 增大感受野,全局特征提取 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as Fcla…

万兆以太网MAC设计(13)主机与FPGA之间进行PING

文章目录 前言:一、ICMP校验和计算二、上板效果1、终端命令行1、wireshark捕捉 前言: 在上板尝试进行PING操作的时候,发现一直是请求超时的情况,结果排查发现是首部校验和没有计算的问题。在UDP层,我们不进行校验和是…

【python】基于岭回归算法对学生成绩进行预测

前言 在数据分析和机器学习领域,回归分析是一种预测连续数值的监督学习技术。当数据特征与目标变量之间存在线性关系时,线性回归模型尤其有用。然而,当特征数量多于样本数量,或者特征之间存在多重共线性时,普通最小二…

jsp 实验16 MVC 表白墙

源代码以及执行结果截图&#xff1a; ExpressWish_Bean.java package web; import java.util.HashMap; import java.util.ArrayList; import java.util.Iterator; public class ExpressWish_Bean { public HashMap<String,ExpressWish> wishList; ArrayList&…

【AI知识】Stable diffusion常用提示词分享

模型&#xff08;Model&#xff09; majicmixRealistic_v7 majicmixRealistic&#xff08;麦橘写实&#xff09;是融合了多种展现日常生活人物形象的写实风格模型&#xff0c;人物的外观更加接近现实生活&#xff0c;对于光影、皮肤、人物动态均有较好的表现&#xff0c;非常…

Java | Leetcode Java题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; public class Solution {public int climbStairs(int n) {double sqrt5 Math.sqrt(5);double fibn Math.pow((1 sqrt5) / 2, n 1) - Math.pow((1 - sqrt5) / 2, n 1);return (int) Math.round(fibn / sqrt5);} }

版本控制工具之Git的基础使用教程

Git Git是一个分布式版本控制系统&#xff0c;由Linux之父Linus Torvalds 开发。它既可以用来管理和追踪计算机文件的变化&#xff0c;也是开发者协作编写代码的工具。 本文将介绍 Git 的基础原理、用法、操作等内容。 一、基础概念 1.1 版本控制系统 版本控制系统&#x…

如何区分APP页面是H5还是原生页面?

刚刚接触手机测试的同学&#xff0c;或多或少都有过这样的疑问&#xff1a;APP页面哪些是H5页面&#xff1f;哪些是原生页面?单凭肉眼&#xff0c;简直太难区分了&#xff01;我总结了6个小技巧&#xff0c;希望能帮大家答疑解惑。 1、看断网的情况 断开网络&#xff0c;显示…

推荐 3 个 yyds 的开源项目!

本期推荐开源项目目录&#xff1a; 1. AI 搜索引擎 2. 大模型聊天框架 3. 模仿抖音的移动端短视频 01 AI 搜索引擎 Perplexica 是一个开源的、由 AI 驱动的搜索引擎。它深入互联网寻找答案&#xff0c;不仅搜索网络&#xff0c;还理解您的问题。 Perplexica 受到 Perplexity AI…

今天来聊聊Numpy!

numpy&#xff1f;what&#xff5e;什么是numpy&#xff1f; 小编先暂且不提。 ​ 大家先暂且看看这句话&#xff0c;“你给我翻 译翻译&#xff0c;什么他妈的是他妈的惊喜&#xff1f; 这还用翻译&#xff0c;都说了… 惊喜嘛……”。 惊喜这段出自《让子…

Could not find the Qt platform plugin “dxcb“ in ““、 重点:是dxcb

这个重点就在于是dxcb不是xcb&#xff0c;让我一顿好找。 https://bugs.launchpad.net/ubuntu/source/deepin-qt5dxcb-plugin/bug/1826629 这篇文章描述了应该是deepin系统的一个问题&#xff0c;应该已经修复了不知道为什么我还会遇到。 不过知道是dxcb后直接去qtcreater里的系…

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

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

基于若依框架搭建网站的开发日志(一):若依框架搭建、启动、部署

RuoYi&#xff08;基于SpringBoot开发的轻量级Java快速开发框架&#xff09; 链接&#xff1a;开源地址 若依是一款开源的基于VueSpringCloud的微服务后台管理系统&#xff08;也有SpringBoot版本&#xff09;&#xff0c;集成了用户管理、权限管理、定时任务、前端表单生成等…

MYSQL8.0.20安装教程

一&#xff1a;下载mysql MySQL :: Download MySQL Installer (Archived Versions) 二&#xff1a;选中server only&#xff0c;点击next 三&#xff1a;点击server 选项&#xff0c;点击Execute 弹窗点击安装 四&#xff1a;安装项为绿色后&#xff0c;点击next 五&#xf…

大数据中的HDFS读写流程(namenode,datanode)

HDFS读写流程 读取流程 1、客户端请求上传文件 2、namenode检查是否存在&#xff0c;可以上传&#xff0c; 3、客户端请求第一个block块上传到datanode 4、namenode返回3个datanode节点&#xff0c;d1,d2,d3 5、客户端请求dn1调用数据&#xff0c;d1收到请求会继续调用d2&#…

使用海外云手机为亚马逊店铺引流

在全球经济一体化的背景下&#xff0c;出海企业与B2B外贸企业愈发重视海外市场的深耕&#xff0c;以扩大市场份额。本文旨在探讨海外云手机在助力亚马逊店铺提升引流效果方面的独特作用与优势。 海外云手机&#xff0c;一种基于云端技术的虚拟手机&#xff0c;能够在单一硬件上…

经典分类网络LeNet5和VGG16项目:实现CIFAR10分类

CIFAR10分类 v1&#xff1a;LeNet5&#xff1a;2cnn3fc 可视化结果 精确率 损失 最佳 v2&#xff1a;LeNet5&#xff1a;3cnn2fc 可视化结果 精确率 损失 最佳 v3&#xff1a;LeNet5&#xff1a;2cnnbnres3fc 可视化结果 精确率 损失 最佳 v4&#xff1a;VG…

web API设计笔记

Hello , 我是小恒。今晚就讲讲我在开发维护API后的经验分享&#xff0c;当然我知识有限&#xff0c;暂时也不会写实际操作。GitHub项目仓库有一堆还在前期开发&#xff0c;我的时间很多时间投在了开源上。 推荐书籍 我认为一个好的 API 设计是面向用户的&#xff0c;充分隐藏底…

2024华为数通HCIP-datacom最新题库(变题版)

请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了&#xff0c;如果你准备去考试&#xff0c;还是用的之前的题库&#xff0c;切记暂缓。 H1…