Linux0.11中MINIX 文件系统

news/2024/5/20 18:35:49

阅读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.mrgr.cn/p/32376270

相关文章

【动态规划】:路径问题_地下城游戏

朋友们、伙计们,我们又见面了,本专栏是关于各种算法的解析,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结构专栏&…

ChatPPT开启高效办公新时代,AI赋能PPT创作

目录 一、前言二、ChatPPT的几种用法1、通过在线生成2、通过插件生成演讲者模式最终成品遇到问题改进建议 三、ChatPPT其他功能 一、前言 想想以前啊,为了做个PPT,我得去网上找各种模板,有时候还得在某宝上花钱买。结果一做PPT,经…

【driver2】设备读写,同步和互斥,ioctl,进程休眠,时间和延时,延缓

文章目录 1.实现设备读写:write函数中一个进程写没问题,两进程写:第一个进程运行到kzalloc时,第二个进程也执行了kzalloc,只第二个进程地址保存在c中,第一个进程分配内存空间地址丢失造成内存泄漏。第一个进…

Spring-依赖来源

依赖来源 1 Spring BeanDefinition(xml,注解,BeanDefinitionBuilder, 还有API实现的单例对象) 2 Spring 内建BeanDefinition 3 内建单例对象 依赖注入和依赖查找的区别 Context.refresh() 的时候会调用这个方法:prepareBeanF…

微服务---gateway网关

目录 gateway作用 gateway使用 添加依赖 配置yml文件 自定义过滤器 nacos上的gateway的配置文件 我们现在知道了通过nacos注册服务,通过feign实现服务间接口的调用,那对于不同权限的用户访问同一个接口,我们怎么知道他是否具有访问的权…

FileLink文件摆渡技术解析:如何实现数据的安全摆渡与隔离

文件摆渡系统,这一现代科技名词,蕴含着深刻的科技内涵和广泛的应用前景。简而言之,文件摆渡系统是一种高效、安全的文件传输工具,它能够在不同的网络环境之间实现文件的快速、稳定传输。在今天的数字化时代,随着数据量…

Linux(openEuler、CentOS8)企业内网DHCP服务器搭建(固定Mac获取指定IP)

----本实验环境为openEuler系统<以server方式安装>&#xff08;CentOS8基本一致&#xff0c;可参考本文&#xff09;---- 目录 一、知识点二、实验&#xff08;一&#xff09;为服务器配置网卡和IP&#xff08;二&#xff09;为服务器安装DHCP服务软件&#xff08;三&a…

【JAVA】类加载过程,以及类加载器

类加载过程&#xff0c;以及类加载器 一、类加载的过程二、类加载器介绍三、跨类加载三、举例说明 一、类加载的过程 类加载是Java虚拟机&#xff08;JVM&#xff09;将类文件加载到内存中并转换成对应的类对象的过程。它确保了类文件能够正确加载并转换成可执行的类对象&…

【半个月我拿下了软考证】软件设计师高频考点--系统化教学-网络安全

&#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件设计师考点暴击 ⭐&#x1f170;️进入狂砍分⭐ ⭐软件设计师高频考点文档&#xff0c; ⭐软件设计师高频考点专栏 ⭐软件设计师高频考点⭐ &#x1f3b6;&#xff08;A) 考点1&#xff0c;网络攻击 理解记忆 &#…

初学python记录:力扣1652. 拆炸弹

题目&#xff1a; 你有一个炸弹需要拆除&#xff0c;时间紧迫&#xff01;你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。 为了获得正确的密码&#xff0c;你需要替换掉每一个数字。所有数字会 同时 被替换。 如果 k > 0 &#xff0c;将第 i 个数字用…

【数据库原理及应用】期末复习汇总高校期末真题试卷06

试卷 一、选择题 1&#xff0e; ________是长期存储在计算机内的有组织,可共享的数据集合. A.数据库管理系统 B.数据库系统 C.数据库 D.文件组织 1&#xff0e; 有12个实体类型&#xff0c;并且它们之间存在15个不同的二元联系&#xff0c;其中4个是1:1联系类型&#xff0c;5…

pgsql查看指定模式的存储过程

pgsql查看指定模式的存储过程 在 PostgreSQL 中&#xff0c;如果你想要查看指定模式的存储过程&#xff08;也称为函数&#xff09;&#xff0c;你可以使用 \df 或 \df 命令在 psql 命令行工具中&#xff0c;或者使用 SQL 查询来从 pg_catalog 系统模式中查询。 \df命令行查询…

基于Python的LSTM网络实现单特征预测回归任务(TensorFlow)

单特征&#xff1a;数据集中只包含2列&#xff0c;时间列价格列&#xff0c;仅利用价格来预测价格 目录 一、数据集 二、任务目标 三、代码实现 1、从本地路径中读取数据文件 2、数据归一化 3、创建配置类&#xff0c;将LSTM的各个超参数声明为变量&#xff0c;便于后续…

如何让加快OpenHarmony编译速度?

OpenHarmony 有两种编译方式&#xff0c;一种是通过 hb 工具编译&#xff0c;一种是通过 build.sh 脚本编译。本文笔者将提升 build.sh 方式编译速度的方法整理如下&#xff1a; 因为笔者只用 build.sh 脚本编译&#xff0c;没用过 hb 工具&#xff0c;好像下面的选项也可以用于…

容灾演练双月报|郑大一附院数据级容灾演练切换

了解更多灾备行业动态 守护数字化时代业务连续 目录 CONTENTS 01 灾备法规政策 02 热点安全事件 03 容灾演练典型案例 01 灾备法规政策 3月19日&#xff0c;工信部发布《工业和信息化部办公厅关于做好2024年信息通信业安全生产和网络运行安全工作的通知》。明确提出“…

llama.cpp制作GGUF文件及使用

llama.cpp的介绍 llama.cpp是一个开源项目&#xff0c;由Georgi Gerganov开发&#xff0c;旨在提供一个高性能的推理工具&#xff0c;专为在各种硬件平台上运行大型语言模型&#xff08;LLMs&#xff09;而设计。这个项目的重点在于优化推理过程中的性能问题&#xff0c;特别是…

我们的小程序每天早上都白屏,真相是。。。

大家好&#xff0c;我是程序员鱼皮。最近我们在内测一款面试刷题小程序&#xff0c;没错&#xff0c;就是之前倒下的 “面试鸭”&#xff01; 在我们的内测交流群中&#xff0c;每天早上都会有同学反馈&#xff1a;打开小程序空白&#xff0c;没任何内容且登录不上。 然后过了…

开源离线AI笔记应用

前言 Reor 是一款人工智能驱动的桌面笔记应用程序&#xff0c;它能自动链接相关笔记、回答笔记中的问题并提供语义搜索。所有内容都存储在本地&#xff0c;支持 Windows、Linux 和 MacOS。Reor 站在 Ollama、Transformers.js 和 LanceDB 等巨头的肩膀上&#xff0c;使 LLM 和嵌…

iceoryx源码阅读(二)——共享内存管理

目录1 共享内存模型2 获取共享内存2.1 MemoryManager::getChunk2.2 MemPool::getChunk3 释放共享内存3.1 SharedChunk::freeChunk3.2 MemPool::freeChunk4 总结 基于共享内存通信的核心在于共享内存的管理,包括共享内存的分配、释放。 1 共享内存模型 iceoryx先将整块共享内存…

iceoryx源码阅读(一)——全局概览

一、什么是iceoryx iceoryx是一套基于共享内存实现的进程间通信组件。 二、源码结构 iceoryx源码包括若干工程,整理如下表所示:下图展示了主要项目之间的依赖(FROM:iceoryx(冰羚)-Architecture):三、iceoryx应用程序结构 iceoryx应用程序有三类进程,分别为Publisher、Su…