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

Linux系统:文件系统前言,详解CHSLBA地址

本节重点

  • 理解硬盘的组成结构与工作原理
  • 理解柱面、扇区
  • CHS地址进行寻址
  • 对整块硬盘的逻辑抽象
  • LBA地址进行寻址
  • LBA与CHS地址的相互转换

一、初识硬盘

1.1 基本概念

硬盘(Hard Disk Drive,HDD)是一种用于存储和检索数据的计算机硬件设备。它使用磁性存储技术,将数据存储在旋转的磁盘(盘片)上,并通过磁头进行读写操作。硬盘是计算机中常见的非易失性存储设备,意味着即使断电,数据也不会丢失。

1.2 主要组成

硬盘通常由以下几个关键部分组成:

  • 盘片(Platters):由金属或玻璃制成的圆形磁盘,表面涂有磁性材料,用于存储数据。
  • 磁头(Read/Write Heads):悬浮在盘片上方,负责读取和写入数据。
  • 主轴电机(Spindle Motor):驱动盘片高速旋转。
  • 控制电路板(Controller Board):管理硬盘的读写操作和数据传输。
  • 接口(Interface):用于连接计算机主板,常见接口包括SATA、SAS和NVMe等。

 

1.3 硬盘的工作原理

硬盘通过磁头在高速旋转的盘片上移动来读取和写入数据。数据以二进制形式存储在盘片的磁性表面上,磁头通过感应磁场变化来读取数据,或通过改变磁场方向来写入数据。

硬盘的容量通常以GB(千兆字节)或TB(太字节)为单位,表示其可以存储的数据量。性能指标包括转速(RPM,每分钟转数)、数据传输速率和访问时间等。

硬盘广泛应用于个人电脑、服务器、数据中心和外部存储设备中,用于存储操作系统、应用程序、用户文件和其他数据。硬盘作为计算机存储的核心组件,其性能和可靠性对系统的整体表现有着重要影响。

二、剖析硬盘

2.1 基本单位“扇区”

在硬盘的主轴电机上有多个盘片,每个盘片都有两面,每一面都是由许多磁道围成的同心圆构成的,在单个磁道上从存储角度来说,磁道也不是连续的它是由很多扇区构成。

这样,硬盘存储数据的基本单位就是“扇区”(Sector)。扇区是硬盘上最小的可寻址存储单元,通常大小为512字节,每个扇区都有一个唯一的地址,操作系统和硬盘控制器通过这个地址来读取或写入数据。

2.2 理解“柱面”

在机械臂杆上的磁头臂并不是单个活动的,而是所有磁头臂“共进退”。

柱面是由多个盘片上相同位置的磁道组成的。例如,如果一个硬盘有3个盘片,每个盘片有2个表面,那么每个柱面将包含6个磁道(3个盘片 × 2个表面)。

2.3 定位一个扇区

伺服系统:硬盘使用伺服系统来精确控制磁头的位置。伺服系统通过读取盘片上的伺服信息(嵌入在磁道之间的特殊标记)来确定磁头的位置。这些信息帮助硬盘控制器调整机械臂的位置,确保磁头准确对准目标磁道。

当硬盘接收到访问特定磁道的指令时,控制器会根据伺服信息计算磁头需要移动的距离和方向。机械臂随后快速移动到目标位置,磁头开始读取或写入数据。整个过程依赖于硬盘的精密机械结构和伺服系统的反馈控制。

这里需要注意的是: 

因为机械臂杆上的磁头臂都是共同活动相应距离,即所有磁头臂都是“共进退”的,本质上在定位一个扇区时所有磁头臂首先会移动到该扇区所在磁道的柱面,当主轴马达带动盘片将相应扇区移动到磁头下时,磁头会主动读取扇区数据。

 2.4 CHS地址

CHS(Cylinder-Head-Sector)地址是一种用于描述硬盘上数据位置的旧式寻址方式。它由三个部分组成:柱面(Cylinder)、磁头(Head)和扇区(Sector)。

 换句话说,CHS地址就是通过柱面号、磁头号、扇区号来定位特定扇区的一种寻址方式。

CHS 寻址的关键概念

柱面(Cylinder)

  • 所有磁面上相同半径的磁道组成的逻辑单元。
  • 柱面号从 0 开始编号。

磁头(Head)

  • 对应磁盘的读写磁头,每个盘面有一个磁头。
  • 磁头号从 0 开始编号(例如,双面磁盘的磁头号为 0 和 1)。

扇区(Sector)

  • 磁道被划分为若干扇区(通常每个扇区 512 字节)。
  • 扇区号从 1 开始编号(历史原因,早期 BIOS 设计如此)。

磁盘容量=磁头数× 磁道(柱面)数× 每道扇区数× 每扇区字节数

CHS寻址的局限性:

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

 三、硬盘的逻辑结构

3.1 单个盘面的逻辑抽象

在这里我们可以将单个盘面想象成一个由一圈一圈磁道卷起来的“磁带”,此时我们将盘面上的磁道拉直就可以发现,整个盘面就可以抽象成一个一维数组,而一维数组的元素就是扇区。此时表示一个扇区我们就可以只使用一个数组下标,这个下标就是LBA地址。

3.2 整个硬盘的逻辑抽象

在对整个硬盘做逻辑抽象时我们也借鉴上面对单个盘面的逻辑抽象的思想,只不过这时抽象的对象我们想象成单个柱面。将单个柱面“拉直”时我们不难发现,柱面可以抽象成一个元素也为扇区的二维数组:

整个硬盘就可以看作由一圈一圈柱面而“卷”起来的,类似我们日常的果丹卷!

所以当我们将硬盘上的每一个柱面都像上述操作一样“拉直”进行抽象化处理时我们就会得到:

 

此时我们不难发现,因为单个柱面可以看作二维数组,而整个硬盘是由许多个柱面构成的。当把整个硬盘的所有柱面都展开“拉直”时,整个硬盘就可以抽象成一个三维数组了。

这也解释了前面使用CHS地址进行寻址的原理:在进行CHS地址进行寻址时本质上就是通过这个抽象来的三维数组寻找柱面,磁道,扇区。

之前我们学过C/C++的数组,多维数组在底层我们都看作成了一维数组。所以在对整个硬盘进行逻辑抽象时,为了方便理解我们可以将其看作成三维数组,但是在底层我们都一律看作一维数组:

 3.2.1 LBA地址

LBA(Logical Block Addressing)地址是一种用于访问存储设备(如硬盘、固态硬盘等)中数据块(扇区)的方法。它通过逻辑块编号来定位数据,而不是使用传统的柱面、磁头和扇区(CHS)寻址方式。LBA地址简化了数据访问过程,使得操作系统和应用程序能够更高效地管理存储设备。

这里逻辑块就是单个扇区大小通常为512字节,每个逻辑块(扇区)都有一个唯一的编号,即LBA地址,本质上就是上述我们将整个硬盘进行逻辑抽象成一维数组的数组下标。当需要读取或写入数据时,操作系统就会指定一个LBA地址,存储设备根据该地址找到对应的逻辑块进行数据操作。

LBA地址的优势

LBA地址的主要优势在于其简单性和兼容性。与CHS寻址相比,LBA地址不需要考虑物理磁盘的几何结构,因此更容易实现跨平台兼容。此外,LBA地址支持更大的存储容量,因为它不受CHS寻址中柱面、磁头和扇区数量的限制。

通过LBA地址,存储设备的数据访问变得更加高效和灵活,适应了现代计算环境的需求。

四、CHS与LBA的相互转化

在旧时的硬盘设计中,LBA(Logical Block Addressing,逻辑块寻址)和CHS(Cylinder-Head-Sector,柱面-磁头-扇区)是两种不同的硬盘寻址方式。早期的BIOS和操作系统通常使用CHS方式进行硬盘寻址,而LBA是一种更现代的寻址方式。

在早期的系统中,即使使用LBA地址,仍需要将其转换为CHS地址进行寻址,因为BIOS和硬盘控制器可能只支持CHS方式。这种转换是为了兼容旧硬件和固件。

4.1 CHS转化成LBA

在理解之前我们需要知道以下基本概念:

  • 扇区号通常是从1开始的,而在LBA中地址是从0开始的
  • 柱面和磁头都是从0开始编号的
  • 磁头数*每磁道的扇区总数=单个柱面的扇区总数

LBA=柱面号C*单个柱面的扇区总数+磁头号H*每磁道扇区数+扇区号S-1 

LBA=柱面号C*(磁头数*每磁道扇区数)+磁头号H*每磁道扇区数+扇区号S-1

4.2 LBA转化成CHS

  • // 表示除取整
  • % 表示取余

柱面号= LBA//单个柱面的扇区总数 (就是磁头数*每磁道扇区数)

磁头号=( LBA%(磁头数*每磁道扇区数) ) // 每磁道扇区数

扇区号= (LBA%每磁道扇区数)+1

 随着技术的发展,现代硬盘和操作系统已经完全支持LBA寻址,不再需要将LBA地址转换为CHS地址进行寻址。现代BIOS和硬盘控制器直接处理LBA地址,简化了硬盘访问过程。因此,在当代系统中,LBA地址可以直接用于硬盘寻址,无需进行额外的转换。

http://www.xdnf.cn/news/5857.html

相关文章:

  • 如何创建maven项目
  • java之网络编程
  • uniapp(vue3)动态计算swiper高度封装自定义hook
  • SD-HOST Controller design-----SD CLK 设计
  • 深度学习之优化器【从梯度下降到自适应学习率算法】(pytorch版)
  • 华为鸿蒙电脑能否作为开发机?开发非鸿蒙应用?
  • 微服务的“导航系统”:使用Spring Cloud Eureka实现服务注册与发现
  • 销售具备的能力有哪些
  • JAVA研发+前后端分离,ZKmall开源商城B2C商城如何保障系统性能?
  • Python中元组(Tuple)使用详解和注意事项
  • Kotlin 中的 Unit 类型的作用以及 Java 中 Void 的区别
  • 拓扑排序+dp
  • STM32-DMA数据转运(8)
  • 直接在Excel中用Python Matplotlib/Seaborn/Plotly......
  • Linux 内核网络协议栈:从 Socket 类型到协议注册的深度解析
  • 思迈特软件携手天阳科技,打造ChatBI金融智能分析新标杆
  • 适应性神经树:当深度学习遇上决策树的“生长法则”
  • Spring Boot 整合 Redis 实战
  • MySQL 事务(二)
  • 在 Qt Creator 中为 QDockWidget 设置隐藏和显示按钮
  • 中电金信参编的国家标准《信息技术 中间件 消息中间件技术要求》正式发布
  • 【爬虫】DrissionPage-1
  • 【TDengine源码阅读】#if defined(__APPLE__)
  • (C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)
  • Android支持离线功能的复杂业务场景(如编辑、同步):设计数据同步策略的解决方案
  • 基于大模型的腰椎管狭窄术前、术中、术后全流程预测与治疗方案研究报告
  • 数据服务包括哪些内容?一文讲清数据服务模块的主要功能!
  • 【HarmonyOs鸿蒙】七种传参方式
  • IoTDB集群的一键启停功能详解
  • 裸机开发的核心技术:轮询、中断与DMA