硬盘寻址 CHS LBA

2023-10-24 10:59
文章标签 硬盘 寻址 chs lba

本文主要是介绍硬盘寻址 CHS LBA,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

近期回顾了下HDD磁盘的结构原理,重新又发现几个比较有意思的问题
稍作整理记录一下。

【背景信息】fdisk -l 命令返回(rhce 7以下)
[root@VM_0_15_centos ~]# fdisk -l
Disk /dev/vda: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00086547

写在前面 先翻译几个单词:

  • heads: 头部 --->这里理解为磁头数
    (PS,HDD中读写磁头是分开的,写+读为一组,这里表示磁头组数,即盘面数 , 一个盘有两个面)

  • sectors / track:扇形 / 小道 --->这里理解为磁道
  • cylinders :圆柱 --->这里理解为柱面

由上面的命令输出可以很直观的了解到这个分区的大小为:53687091200 bytes
即: 255 heads 63 sectors/track 6527 cylinders = 104856255(总sectors数)

            104856255 * 512 = 53686402560  bytes数

这里开始抛几个小问题:

  1. 为什么磁头数为单数? 另外数值为什么有255这么“巨”大?
  2. 磁道外圈与内圈周长 相差巨大,为什么扇区数一样? 且为什么是 63 ?
  3. 为什么我们实际计算的53686402560 bytes数 与 53687091200 bytes不相等?

    要解释这几个问题,我们还是一定要引出 磁盘寻址 这个知识点。

    磁盘寻址,意思就是kernel 如何找到 PBA(物理块地址)的一种实现方式。
    主要有两种 CHS(老式) 和 LBA

    CHS
    由于早期磁盘的每个磁道的扇区数一样多(外圈磁颗粒稀疏,耐用性强),
    整体磁盘空间大小也不大。所以在设计时用了24位来表示:10+8+6
    C, (柱面数) 可编程数为 2^10 =1024
    H, (磁头数) 可编程数为 2^8 =256
    S, (扇区数) 可编程数为 2^6 =64
    由于1位用于特殊作用,均需要减1 即最大寻址空间为:
    1023 255 63 * 512 = 8414461440 bytes = 8G+

    很显然随着存储需求增加,单块磁盘的存储空间已经有了很大量级的发展。
    其中物理特性里,主要的几个关键参数均有改变:

    磁盘面的磁颗粒更高密+磁头更稳定更细(影响C)
    磁盘面的磁颗粒均匀分布(影响S)
    磁盘增加磁盘盘面(影响H)
    改变后之前的算法就不在适用于现在的这种结构了。所以就出了新的寻址
    方式LBA 逻辑块地址(从0开始计,一直到最后一个扇区)。

但为了兼容老式的计算方式以及更为立体的体现硬盘物理构造形态(个人理解),还是会体现出CHS的信息出来。

OK, 了解到这里 最上面的几个问题就很好解答了:
硬盘寻址 CHS LBA

  1. 为什么磁头数为单数? 另外数值为什么有255这么“巨”大?
    这里不是真实的磁头数,只是为了在LBA换算成CHS时均用了CHS的最
    大值来转换运算而已。如上面截图一块东芝3T的盘就是 8个盘面 16个磁头数

  2. 磁道外圈与内圈周长 相差巨大,为什么扇区数一样? 且为什么是 63 ?
    同理63也不是真实是这样,真实情况肯定是外圈扇区数比内圈大
  3. 为什么我们实际计算的53686402560 bytes数 与 53687091200 bytes不相等?
    这个个人是这样理解:Units = cylinders of 16065 512 = 8225280 bytes
    CHS的一个最小计算单元,即一1个柱面所拥有的扇区数: 255
    63 = 16065
    那么在LBA上表示出CHS时肯定以LBA为准,CHS作为参考。为此当有零头数时,就直接去掉不在CHS上做显示处理。实际情况中LBA总扇区数几乎一定不是 16065的倍数,所以我们用CHS去计算总大小时会比LBA的值稍小一点。范围是在(1~16064) * 512

end.

转载于:https://blog.51cto.com/201438gz/2342190

这篇关于硬盘寻址 CHS LBA的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/274691

相关文章

win7如何设置SATA硬盘

Win7在安装时设置的是IDE,安装完后需要在注册表中设置为SATA,否则直接设BIOS会不认硬盘,具体如下 注册表子项:HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/Msahci 找到Start键,将值0改为3

有关机械硬盘的基础知识

1,机械硬盘的品牌   目前市场中常见的笔记本电脑的机械硬盘品牌主要有希捷、西部数据、三星等。   2,机械硬盘的容量   硬盘容量,即硬盘所能存储的最大数据量。虽然笔记本电脑硬盘的容量会因单位密度的提升而增加,不过和台式电脑的大容量比起来,笔记本电脑硬盘的容量仍然落后许多。笔记本电脑的硬盘除了对磁盘有体积较小和数量较少的要求之外,对功耗、耐用程度、抗震性及成本等的考虑,也让笔记

基于元神操作系统编程读取硬盘文件

1. 背景 本文介绍了在元神操作系统上读取硬盘文件的方法,示例所用的硬盘是NTFS文件系统的、有2个分区的硬盘。 2. 方法 (1)编写程序 本例通过调用元神操作系统的API来读取指定文件的内容,并以二进制数据(十六进制格式)的形式打印到屏幕上,代码如下所示: use32START:pushacall demo_read_disk_filepopairetinclude 'api_def

查看当前主机的硬盘是固态硬盘还是机械硬盘

windows主机下查看硬盘类型方法: 打开dos界面,输入 powershell进入powershell界面 在PowerShell窗口中,输入 Get-PhysicalDisk 命令并按回车。 发现MediaType下面的值为HDD,即为机械硬盘,如果是固态硬盘,则为SSD

导出硬盘所有文件名到txt文本文件——C#学习笔记

下面的示例演示如何使用递归遍历目录树。递归方法很简洁,但如果目录树很大且嵌套很深,则有可能会引起堆栈溢出异常。 对于所处理的特定异常以及在每个文件和文件夹上执行的特定操作,都只是作为示例提供。您应该修改此代码来满足自己特定的需要。有关更多信息,请参见代码中的注释。 如下图所示:  附代码如下: using System;namespace 创建人族{public class Recu

如何在不重装的前提下,将1TB的硬盘克隆到500GB的固态硬盘?

借助傲梅分区助手,你能够在Windows 11、10、8、7中轻松的将1TB硬盘克隆到500GB固态硬盘。并且无需重新安装系统,即可轻松实现1TB机械硬盘升级至固态硬盘。 问:可以克隆到较小的固态硬盘吗? “大家下午好!我刚买了一块三星500 GB固态硬盘,目的是为了缩短启动时间和提高响应速度,因此想替换旧的1TB机械硬盘。不过,我不想在新的固态硬盘上重新安装Windows 系统和所有程序。所

【软件逆向】第30课,软件逆向安全工程师之(五)寄存器相对寻址,每天5分钟学习逆向吧!

寄存器相对寻址是汇编语言中的一种寻址方式,它结合了寄存器间接寻址和立即数偏移。在这种寻址方式中,操作数的有效地址是通过将一个寄存器的内容与一个固定的偏移量(立即数)相加来得到的。以下是关于寄存器相对寻址的详细信息: 寄存器相对寻址的特点: 操作数地址是寄存器内容与偏移量的和:有效地址是寄存器的内容加上一个固定的立即数偏移量。灵活且具体:提供了对特定内存位置的间接访问,同时允许通过改变寄存器的内

Unity3D 获取资源运行时内存和硬盘大小

Unity3D 🌻获取资源运行时内存和硬盘大小 🌻内存 使用Profiler可以查看某个资源的内存占用情况,但是必须启动游戏,并且待查看的资源已经载入游戏中。我希望的是不启动游戏,也能看到它的内存好做统计。 🌻硬盘 由于unity中的资源压缩格式记录在meta中所以,在文件夹中看到的资源大小是不正确的。打开unity需要选择一个资源,比如Texture、然后在右侧Ins

KVM挂载本地硬盘

KVM挂载本地硬盘 改用了deepin,但说真的,部分软件真的不好用,还有bug… 最后还是用kvm部署了一台win10虚拟机,并准备把一个本地硬盘挂载到这台虚拟机上 编辑虚拟机的配置文件 virsh edit win10 增加以下内容 <disk type='block' device='disk'><driver name='qemu' type='raw'

【软件逆向】第27课,软件逆向安全工程师之(二)寄存器寻址,每天5分钟学习逆向吧!

寄存器寻址是汇编语言中的一种寻址方式,在这种方式中,操作数位于CPU的寄存器中。寄存器是CPU内部的高速存储位置,用于快速访问数据。以下是关于寄存器寻址的详细信息: 寄存器寻址的特点: 操作数在寄存器中:数据直接存储在寄存器中,而不是内存地址或立即数。快速访问:由于寄存器位于CPU内部,因此访问速度远快于内存。指令简短:使用寄存器寻址的指令通常较短,因为不需要指定内存地址。 识别寄存器寻址: