【linux】:模拟文件基本操作以及文件在磁盘中如何存储的学习(下)

简介: 【linux】:模拟文件基本操作以及文件在磁盘中如何存储的学习(下)

二、磁盘文件



一个文件在不被打开的时候是存储在磁盘中的,那么这个文件如何在磁盘中合理的存储呢?要了解文件如何在磁盘中存储,我们要先了解磁盘,如下图所示:

d7c02aa068e94f5295241b1bdaaa40cb.png




磁盘有几个重要的接口,分别是马达,盘片,磁头,一个磁头可以读取一个面的数据。磁盘中每个数据都是0 1,,01 的表示有很多种,波峰波谷,南极北极等,并且磁头和盘面是不接触的,只不过他们离的距离很近,下面是盘面的结构:

5053c2bc53d3490f8b787865c9a57556.png


在盘面上有扇区和磁道,一般的磁盘所有的扇区都是512字节,那么如何在硬件上定位一个扇区呢?要定位扇区首先要定位哪一个盘面,而盘面又是通过磁头确定的,因为磁头有相应的编号,通过磁头的编号就能找到哪个面了,找到面后我们要找扇区需要先定位在哪一个磁道,而磁道是通过半径决定的,在确定在该磁道在哪一个扇区,根据扇区的编号定位一个扇区。理解了以上的知识,我们就能谈文件是如何在磁盘中存储的了,一个普通文件(属性+数据)都是数据0,1,对于0 1这样的数据无非就是占用一个或者多个扇区,来进行自己的数据存储的,我们既然能够用CHS定位任意一个扇区,我们就能定位任意多个扇区,从而将文件从硬件角度,进行读取或者写入。


下面我们根据操作系统和磁盘的关系分析一下磁盘:


根据我们上面的描述,如果操作系统能够得知任意一个CHS地址,就能访问任意一个扇区,那么操作系统内部是不是直接使用的CHS地址呢?答案其实不是,因为操作系统是软件,磁盘是硬件,硬件定位一个地址,如果操作系统直接用了这个地址,玩意硬件变了呢?这样的话操作系统也要发生变化,操作系统要和硬件做好解耦工作所以不能直接用硬件上的地址。并且扇区才512字节,操作系统实际向外设写入的基本单位是4KB,与扇区并不符合,所以操作系统需要有一套新的地址来进行块级别的访问。现在我们画一张图表示一下磁道中的扇区结构:

5c30d64277a24ce38fa703b309d7d1a1.png

每一个扇区都是512,我们从头开始数512就找到了第一个扇区。这就印证了计算机常规的访问方式:起始地址 + 偏移量的方式,也就是说我们只需要知道数据块的起始地址(第一个扇区的下标地址)+4KB(块的类型)如下图所示:

4edb2b231e8d48208d5b23fbbd59e0bb.png


所以块的地址,本质就是数组的一个下标N,以后我们表示一个块,我们可以采用线性下标N的方式定位任何一个块了。OS->N->LBA->逻辑块地址,前面我们说了,磁盘只认CHS方式,所以要让这两个联系起来就需要LBA到CHS互相转化。就拿我们的电脑而言,我们进入我的电脑发现有ABCD 4个盘或者几个盘,而实际只有一个盘,是因为将这一个盘分区管理得到的四个盘,就如下图所示:

c87b8f024dcc480eadbc68a851ddd33d.png


如上图所示,我们将500G的磁盘分为150G一组,那么在这个150G的盘中都有什么呢?其实上图已经给出答案了,Boot Block主要保存与操作系统启动相关的内容,比如分区表,操作系统镜像的地址等,所以一般分区会在0号盘面0号磁道1号扇区保存的,对应的在C盘的某个区域存储,而这个块又被称为启动块,如果这个块坏了就不能开机了。文件= 内容+属性,linux下是将内容和属性分离的。


1.SuperBlock保存的是文件系统的所有属性信息,比如文件系统的类型,整个分组的情况。而SuperBlock在各个分组里面可能都存在,而且是统一更新的,这样做的原因是防止SuperBlock区域坏掉,如果出现故障,整个分区不可以再被使用。


2.GroupDescriptorTable:组描述符,改组内的详细统计等属性信息。


3.inodeTable:一个文件内部所有属性的集合,inode节点(128字节),一个文件一个inode,其中即便是一个分区,内部也会存在大量的文件即会存在大量的inode节点,一个group需要有一个区域,专门保存该group内的所有文件的inode节点。分组内部,可能存在多个inode,需要将inode区分开来,每一个inode都有自己的inode编号,inode编号也属于对应文件的属性id。


4.DateBlocks:文件的内容是变化的,我们是用数据块来进行文件的内容的保存的,所以一个有效文件要保存内容,就需要[1,n]数据块,那么如果是多个文件所以就需要更多的数据块,而DateBlock就是保存这些数据块的。而linux查找文件是要根据inode编号来进行文件查找的,包括读取内容,一个inode对应一个文件,而改文件inode属性和改文件对应的数据块是有映射关系的。


5.块位图BlockBitmap:BlockBitmap中记录着DateBlock中哪个数据块已经被占用,哪个数据块没有被占用。


6.inode位图inodeBitmap:每个bit表示一个inode是否空闲可用


总结



本篇文章的主要内容是在上一篇文件操作的基础上再次深刻理解系统文件操作,然后我们又大致讲解了磁盘的物理空间是什么样的是如何存储数据的,通过软硬件共同学习我们能知道文件的各个属性在磁盘中是如何存储的,每个分

目录
相关文章
|
2月前
|
Linux 编译器 开发工具
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
110 2
|
21天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
53 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
7天前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
64 14
|
6天前
|
存储 NoSQL Linux
linux积累-core文件是干啥的
核心文件是Linux系统在程序崩溃时生成的重要调试文件,通过分析核心文件,开发者可以找到程序崩溃的原因并进行调试和修复。本文详细介绍了核心文件的生成、配置、查看和分析方法
34 6
|
8天前
|
存储 NoSQL Linux
linux之core文件如何查看和调试
通过设置和生成 core 文件,可以在程序崩溃时获取详细的调试信息。结合 GDB 等调试工具,可以深入分析 core 文件,找到程序崩溃的具体原因,并进行相应的修复。掌握这些调试技巧,对于提高程序的稳定性和可靠性具有重要意义。
47 6
|
2月前
|
Linux 开发工具 Perl
在Linux中,有一个文件,如何删除包含“www“字样的字符?
在Linux中,如果你想删除一个文件中包含特定字样(如“www”)的所有字符或行,你可以使用多种文本处理工具来实现。以下是一些常见的方法:
43 5
|
Linux 开发工具 Shell
|
Shell Linux 数据安全/隐私保护