当前位置: 首页 > news >正文

【Linux】磁盘存储+文件系统简介

目录

1、理解硬件

1.1 磁盘构成

1.2 CHS地址定位

1.3 磁盘的逻辑结构

1.3.1 理解过程

 1.3.2 真实过程

2、引入文件系统

2.1 引入“块的概念”

2.2 引入“分区”概念

2.3 了解分组细节


正文:

1、理解硬件

1.1 磁盘构成

磁盘由主轴马达、磁盘、磁头、磁头臂、永磁铁构成。如下图:

图中那面光滑的可以照镜子的圆盘就是磁盘,光滑的磁盘上其实有一圈一圈磁道,磁道又由一个一个扇区组成,每条磁道上扇区个数都是相同的。

扇区:是磁盘存储数据的基本单位,512字节,块设备

如何定位⼀个扇区呢?
• 可以先定位磁头(header)
• 确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)
• 定位⼀个扇区(sector)


1.2 CHS地址定位

每个磁头、磁道、扇区都有编号,起始编号分别是:0,0,1 这就称为CHS地址定位

文件=内容+属性都是数据,无非就是占据那几个扇区的问题!能定位一个扇区了,能不能定位多个扇区呢?
在这里插入图片描述

扇区是从磁盘读出和写入信息的最小单位,通常大小为 512 字节。
磁头(head)数:每个盘片一般有上下两面,分别对应1个磁头,共2个磁头
磁道(track)数:磁道是从盘片外圈往内圈编号0磁道,1磁道…,靠近主轴的同心圆用于停靠磁头,不存储数据
柱面(cylinder)数:磁道构成柱面,数量上等同于磁道个数
扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同
圆盘(platter)数:就是盘片的数量
磁盘容量=磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数
细节:传动臂上的磁头是共进退的
柱面(cylinder),磁头(head),扇区(sector),显然可以定位数据了,这就是数据定位(寻址)方式之一

**CHS寻址
对早期的磁盘⾮常有效,知道⽤哪个磁头,读取哪个柱⾯上的第⼏扇区就可以读到数据了。
但是CHS模式⽀持的硬盘容量有限,因为系统⽤8bit来存储磁头地址,⽤10bit来存储柱⾯地
址,⽤6bit来存储扇区地址,⽽⼀个扇区共有512Byte,这样使⽤CHS寻址⼀块硬盘最⼤容量
为256 * 1024 * 63 * 512B = 8064 MB(1MB = 1048576B)(若按1MB=1000000B来算就是
8.4GB)

1.3 磁盘的逻辑结构

【结论:磁盘是一个以扇区为单位的一维数组】

1.3.1 理解过程

逻辑上我们可以把一面磁盘想象成为卷在⼀起的磁带,把磁带“拉直”,形成线性结构,全是扇区

每面磁盘扇区总数相等,每条磁道扇区个数相等。

把多面磁盘按线性结构展开就是一个一维数组 ,确定一个扇区等于确定一个一维数组下标

用数组下标定义任意扇区称为:LBA

但系统不认识LBA只认CHS,所以要把LBA转换成CHS(转换由磁盘自己完成,我们知道磁盘容量就行)

LBA转成CHS:
• 柱⾯号C = LBA // (磁头数*每磁道扇区数)【就是单个柱⾯的扇区总数】
• 磁头号H = (LBA % (磁头数*每磁道扇区数)) // 每磁道扇区数
• 扇区号S = (LBA % 每磁道扇区数) + 1
• "//": 表⽰除取整

例如:告诉我们磁盘有100面,10磁道,有个下标124,如何转成CHS?

124/100=1(H)找到第一面

124%100=24,24/10=2(C)确定磁道

24%10=4(S)确定扇区

这就是把LBA转换成CHS过程。 

以上是以面为单位展开,磁盘真实展开并不以物理盘面展开,而是以柱面为单位展开

 1.3.2 真实过程

⼀个细节:传动臂上的磁头是共进退的

柱面是⼀个逻辑上的概念,其实就是整个磁盘所有盘面的统一磁道。
所以,磁盘物理上分了很多⾯,但是在我们看来逻辑上,磁盘整体是由“柱⾯”卷起来的。

所以,磁盘的真实情况是:
磁道:
某⼀盘⾯的某⼀个磁道展开:

即:⼀维数组
柱⾯:
整个磁盘所有盘⾯的同⼀个磁道,即柱⾯展开:这不就是个二维数组

整盘:整个磁盘不就是多张⼆维的扇区数组表(三维数组)

所以,寻址⼀个扇区:先找到哪⼀个柱⾯(Cylinder) ,在确定柱⾯内哪⼀个磁道(其实就是磁头位置Head),在确定扇区(Sector),所以就有了CHS。
我们之前学过C/C++的数组,在我们看来,其实全部都是⼀维数组: 

 为什么要用CHS寻址,因为磁盘是三维的有三个下标,下标顺序不能乱!

LBA转换成CHS本质:一维数组下标转换成三个数字【数组的下标就是每⼀个扇区的LBA地址。OS使⽤磁盘,就可以⽤⼀个数字访问磁盘扇区了】磁盘就是一个以扇区为单位的一维数组

2、引入文件系统

2.1 引入“块的概念”

其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个”块”(block)
硬盘的每个分区是被划分为⼀个个的”块”。⼀个”块”的大小是由格式化的时候确定的,并且不可更改,最常⻅的是4KB,即连续八个扇区组成⼀个 ”块”。”块”是文件存取的最小单位。如下图:

通过上图,当给你一个磁盘总容量,总容量/4KB就知道有多少块,拿着块号++/--往上找不就可以访问任意扇区。

因此,OS看待磁盘认为是一个块设备,每块都有下标,文件OS的角度看待磁盘也是块设备,有两种访问方式:LBA和块号,而LBA又可以转换成块号。

2.2 引入“分区”概念

磁盘是一个个块组成,当磁盘很大OS还是不好管理,所以再分区,如果还大就再分组。把每个组管理好等于把磁盘管理好(分治思想

把磁盘分区后只要知道从哪个块号开始到哪个块号结束为一个分区,也就可以把整个分区内的内容管理好。例如Windows上我们有C、D、E、F盘,实际上我们只有一块物理盘,只是分区把它分成大家所看到的C、D、E、F盘。

2.3 了解分组细节

文件 = 内容 + 属性    对于Linux来说不管是内容还是属性都是数据,既然是数据就要存储。在还没被加载到内存前存放在磁盘中。

1. Linux中内容和属性分开存储

2. OS文件系统中和磁盘进行IO的基本单位是4KB(所以每个数据块大小是4KB)

以上是对文件系统的简要介绍,具体inode如何存储等一系列问题都还没解答!为了知识点的连贯性,统一放在下节ext2文件系统部分详细介绍。


感谢观看,下节再见~

http://www.lryc.cn/news/607567.html

相关文章:

  • 开箱即用的Next.js SSR企业级开发模板
  • Java Ai 数组:day(09)
  • 【Nginx反向代理】通过Nginx反向代理将多个后端server统一到同一个端口上的方法
  • 算法题——数组
  • Implement recovery based on PITR using dump file and binlog
  • Deep Height Decoupling for Precise Vision-based 3D Occupancy Prediction
  • 【JAVA面试】基础篇
  • 代码随想录算法训练营三十三天|动态规划part06
  • GenieWizard: Multimodal App Feature Discovery with LargeLanguage Models
  • 直播平台中的美白滤镜实现:美颜SDK的核心架构与性能优化指南
  • Java 22 新特性解析与代码示例
  • Corrosion2靶机攻略
  • three.js实现随机山脉波纹效果
  • 【LeetCode刷题指南】--单值二叉树,相同的树
  • RustFS:高性能文件存储与部署解决方案(MinIO替代方案)
  • session和cookie作用详解
  • Solana:解决Anchor Build编译程序报错 no method named `source_file` found for struct
  • 设计模式1:创建型模式
  • 后台管理系统权限管理:前端实现详解
  • PDFsam免费开源!PDF分割合并工具
  • unity学习——视觉小说开发(一)
  • AI应用UX设计:让技术更懂用户
  • Android Jetpack 系列(五)Room 本地数据库实战详解
  • 第一个大语言模型的微调
  • Transformer架构全解析:搭建AI的“神经网络大厦“
  • Spring之【循环引用】
  • 插件升级:Chat/Builder 合并,支持自定义 Agent、MCP、Rules
  • 小学阶段的学习机推荐:科大讯飞T30、Lumie 10学习机暑期16项AI功能升级
  • 代码随想录day52图论3
  • Effective C++ 条款15:在资源管理类中提供对原始资源的访问