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.mzph.cn/diannao/9761.shtml

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

相关文章

部署xwiki服务需要配置 hibernate.cfg.xml如何配置?

1. 定位 hibernate.cfg.xml 文件 首先,确保您可以在 Tomcat 的 XWiki 部署目录中找到 hibernate.cfg.xml 文件: cd /opt/tomcat/latest/webapps/xwiki/WEB-INF ls -l hibernate.cfg.xml如果文件存在,您可以继续编辑它。如果不存在&#xff…

使用GitLab自带的CI/CD功能在远程服务器部署项目(三)

前置内容: 通过Docker Compose部署GitLab和GitLab Runner(一) 使用GitLab自带的CI/CD功能在本地部署项目(二) 目录 一、在GitLab服务器上生成私钥与公钥 二、将公钥拷贝到应用服务器上 三、将私钥给到Docker Exec…

深入解析Java中Set接口

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

数据驱动实战二

目标 掌握数据驱动的开发流程掌握如何读取JSON数据文件巩固PO模式 1. 案例 对TPshop网站的登录模块进行单元测试 1.1 实现步骤 编写测试用例采用PO模式的分层思想对页面进行封装编写测试脚本定义数据文件,实现参数化 1.2 用例设计 1.3 数据文件 {"login…

设置LCD为第二终端

我一直使用xshell端,开发板通过串口和 xshell进行通信。 调试好LCD 驱动之后,可以设置 LCD 作为终端,也就是开发板使用自己的显示 设备作为自己的终端,然后接上键盘就可以直接在开发板上敲命令了,将 LCD 设置为终端控制…

Linux(利用gdb进行调试)

gdb: gdb是GNU debugger的缩写,是编程调试工具。 gdb功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序。 2.让被调试的程序在用户所指定的调试的断点处停住 (断点可以是条件表达式)。 3.当程序停住时,可以检查此时程序中所发…

基于torch_dispatch机制生成Megatron-DeepSpeed调用关系图

基于torch_dispatch机制生成Megatron-DeepSpeed调用关系图 一.局部效果图二.运行训练过程,拦截算子,生成调用关系信息三.可视化,生成SVG图像 想知道Megatron-DeepSpeed训练过程中各模块之间的调用关系。torch_dispatch机制可以拦截算子,inspect又能获取到调用栈(文件,类名,函数…

笔记本电脑怎么查看硬盘型号?无需额外软件,五招让你轻松掌握

随着科技的进步,笔记本电脑已经成为我们日常生活和工作中不可或缺的工具。而在选购或维护笔记本电脑时,了解硬盘的型号和性能是至关重要的。本文以windows10系统为例,将向您介绍几招,帮助您轻松掌握查看笔记本电脑硬盘型号的方法。…

适合年轻人的恋爱交友脱单软件有哪些?中国十大社交软件排行榜分享

交友始祖:Tinder 一直很受欢迎,可以向上扫给 super like (每日有一次免费机会)。如果双方互相 like,代表配对成功,就可以开始聊天。另外,每日有 10 个 top picks 供选择,你可以免费选一位 主力编外&#xf…

Java医院绩效考核系统源码maven+Visual Studio Code一体化人力资源saas平台系统源码

Java医院绩效考核系统源码mavenVisual Studio Code一体化人力资源saas平台系统源码 医院绩效解决方案包括医院绩效管理(BSC)、综合奖金核算(RBRVS),涵盖从绩效方案的咨询与定制、数据采集、绩效考核及反馈、绩效奖金核…

67万英语单词学习词典ACCESS\EXCEL数据库

这似乎是最多记录的英语单词学习词典,包含复数、过去分词等形式的单词。是一个针对想考级的人员辅助背单词学英语必备的数据,具体请自行查阅以下的相关截图。 有了数据才能想方设法做好产品,结合权威的记忆理论,充分调动用户的眼…

Cocos creator实现《战机长空》关卡本地存储功能

Cocos creator实现《战机长空》关卡本地存储功能 Cocos creator在开放小游戏过程中,经常会出现设置关卡,这里记录一下关卡数据本地存储功能。 一、关卡设置数据 假如我们有关卡数据如下, let settings [ { level: 1, // 第1关 score: 0,…

画出入学管理系统的顶层图和1层图

(学校作业) 题目如下: 某培训机构入学管理系统有报名、交费和就读等多项功能,下面是对其各项功能的说明: 1、报名:由报名处负责,需要在学员登记表上进行报名登记,需要查询课…

微软必应bing国内广告开户费用?如何开户投放?

当下搜索引擎广告无疑是企业触达潜在客户、提升品牌曝光度的重要途径之一,微软必应(Bing)作为全球第二大搜索引擎,尽管在国内市场份额上可能不敌某些本土巨头,但其独特的用户群体和国际影响力使其成为众多企业拓展市场…

【数据结构与算法】常见的排序算法

文章目录 排序的概念冒泡排序(Bubble Sort)插入排序(Insert Sort)选择排序(Select Sort)希尔排序(Shell Sort)写法一写法二 快速排序(Quick Sort)hoare版本&a…

前端Vue uView 组件<u-search> 自定义右侧搜索按钮样式

前言 uView 文档的效果不是ui设计的样式 需要重新编辑 原效果 ui设计效果 解决方案 设置里说明的需要传一个样式对象 这个对象 需要写在 script 标签里面 这里需要遵循驼峰命名 比如font-size 改为 fontSize lineHeight和textAlign为水平锤子居中效果 searchStyle: {ba…

Box86源码解读记录

1. 背景说明 Github地址:https://github.com/ptitSeb/box86 官方推荐的视频教程:Box86/Box64视频教程网盘 2. 程序执行主体图 Box86版本: Box86 with Dynarec v0.3.4 主函数会执行一大堆的初始化工作,包括但不限于:BOX上下文 …

腾讯云coding代码托管平台配置问题公钥拉取失败提示 Permission denied(publickey)

前言 最近在学校有个课设多人开发一个游戏,要团队协作,选用了腾讯云的coding作为代码管理仓库,但在配置的时候遇到了一些问题,相比于github,发现腾讯的coding更难用,,,这里记录一下…

【Android Studio】【NCNN】YOLOV8安卓部署

目录 下载Android Studio 克隆安卓项目 关于自训练模型闪退问题 下载Android Studio 下载Android Studio,配置安卓开发环境,这个过程比较漫长。 安装cmake,注意安装的是cmake3.10版本。 根据手机安卓版本选择相应的安卓版本&#xff0c…

彻底解决python的pip install xxx报错(文末附所有依赖文件)

今天安装pip install django又报错了: C:\Users\Administrator>pip install django WARNING: Ignoring invalid distribution -ip (d:\soft\python\python38\lib\site-pac kages) Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting djan…