CHS 到 LBA 映射 -(磁盘存储)

CHS 到 LBA 映射 -(磁盘存储)

在 LBA 之前,您只是拥有磁盘的物理映射,最初在旧的 IBM-PC 兼容机器上使用 BIOS 进行磁盘访问看起来如下所示:

  • 汽缸数:(10b)
    • 0-1024(1024 = 2^10)
  • 头数: (8b)
    • 0-256(256 = 2^8)
  • 扇区号 (6b)
    • 0 通常保留用于“引导扇区“(C-0,H-0,s-0)
    • 1-64 (63 = 2^6 - 1) *0 为保留

总 CHS 地址:24b (10+8+6)


过去,平均(文件|块|扇区)大小为 512B。

示例来自维基百科

512(bytes) × 63(sectors) x 256(heads) × 1024(cylinders) = 8064 MiB (yields what is known as 8 GiB limit) 

我感到困惑的是实际上是 LBA 公式中提到的 heads-per-cylinder。这对我来说没有意义,因为据我所知,头部是,除非它是可移动媒体每个拼盘有两个 (顶部、底部),每个表面各一个。

在此处输入图片描述

在我看来,将它们称为heads-per-disk或更有意义heads-per-surface,因为圆柱体穿过整个磁盘(多个盘片)。

在此处输入图片描述


逻辑块寻址:

公式:A = (c ⋅ Nheads + h) ⋅ Nsectors + (s − 1)

  • A- 逻辑块地址
  • Nheads- 磁盘上的磁头数量heads-per-disk
  • Nsectors- 磁道上的扇区数sectors-per-track
  • c,h,s- 是磁柱、磁头、磁扇区号24-bits total (10+8+6)

看看第一个例子这里

For geometry 1020 16 63 of a disk with 1028160 sectors CHS 3 2 1 is LBA  3150=(3× 16+2)× 63

几何学:(这是由制造商定义的)

  • 气缸 - 1020
  • 头数:16
  • 部门 - 63

答案1

总的来说,您的术语使用得相当马虎,因此这会造成进一步的混淆。

1024 位可寻址数(1024 = 2^10)

IBM PC/XT 使用 Western Digital WD1010 磁盘控制器,该控制器使用(在硬件寄存器中)10 位柱面编号。
第一个柱面的地址为 0,因此共有 1024 个柱面地址。
"可寻址号码“是无稽之谈。”

-1 表示“引导扇区”(c-0、h-0、s-0),
63 位可寻址数(63 = 2^6 - 1)

第一个扇区(每个磁道的)地址为 1,因此 6 位扇区号可以寻址每个磁道上最多 63 个扇区(扇区号 1 到 63)。
没有扇区地址为零。它不是保留的。它不存在。
减去此偏移量是算术上的必需,与引导扇区没有任何关系。使用磁盘驱动器的第一个扇区(或任何扇区)进行引导(或任何功能)与减去起始偏移量的需要无关。

因此,我可以得到以下理论最大地址:

512(字节)× 63(扇区)x 256(磁头)× 1024(磁柱)= 8064 MiB

不,这是最大容量。
磁盘地址是针对扇区的,而不是针对字节的。

我理解头部号码是一个 246 位可寻址数字......

嗯???“可寻址数字”???
驱动器参数之一是磁头数(在一个磁柱中)。CHS
地址中的数字之一是磁头数。246
位???

我感到困惑的是,当提到头部时,它到底是什么heads-per-track

Heads-per-track是您编造的,因为 PC 中使用的典型 HDD 没有这样的参数(即该数字始终为 1)。
特定轨道只能由一个特定的 R/W 磁头读取和写入。
每个表面有一个 R/W 磁头。(您不太可能使用双端口驱动器。)
R/W 磁头安装在臂的末端。
所有 R/W 磁头和臂都包含一个由执行器移动/旋转的组件。
(但也有固定的磁头磁盘驱动器,例如每个磁道一个磁头,寻道时间为零。)

这些术语对我来说没有任何意义,因为据我所知,磁头是(实际执行读/写操作的臂),除非是可移动介质,否则每个盘片都有两个磁头(顶部、底部),因此将它们称为每盘片磁头数或每盘磁头数更有意义……而实际上应该是每磁道扇区数,对吗?

那么显然你搞不清楚磁头是什么。
你还把“盘片”和“表面”搞混了。
没有要求必须使用盘片的两面,因此每个表面都被视为一个单元,而不是盘片作为一个单元。
有一个名为 的驱动器参数sectors per track

heads-per-track现在,当您查看从 CHS 到 LBA 的转换时就会出现这个术语。

再次,你似乎编造了一些东西。每条轨道的磁头数是统一的。

但是几何 1020,16,63 如何转换为 CHS 3,2,1 有人可以向我解释一下吗?

LBA 是扇区地址。CHS
也是扇区地址。
为了将一种地址格式转换为另一种地址格式,您需要指定驱动器几何结构:

. number of cylinders  
. number of heads (per cylinder)  
. number of sectors per track

您无法将几何图形*翻译*为地址;您使用几何结构来转换地址。如果驱动器几何结构为,则
CHS 地址3,2,1相当于 LBA 地址。31501020,16,63


修订后课题的附录

在我看来,将它们称为“每盘磁头数”或“每表面磁头数”更有意义,因为一个圆柱体穿过整个磁盘(多个盘片)。

在我读过的众多技术文档(来自磁盘驱动器制造商)中,单端口驱动器的规格表会列出读写头数量盘片数量heads per disk。从来就不存在、heads per surface或的比率heads per platter

在我作为软件/固件工程师开发控制器固件、磁盘设备驱动程序和文件系统处理程序的工作中,我从未关心过或不得不使用盘片数量。盘片数量或盘片可能有两个表面是机械性能与 CHS 寻址的驱动器几何形状完全无关。

CHS 中的 C 表示磁柱地址。磁盘驱动器必须(以机电方式)寻找到请求的气缸地址/位置,以便 R/W 头组件正确定位。

CHS 中的 H 表示读写头地址。磁盘控制器(电气上)选择请求的 R/W 磁头(寻道完成后)按其地址访问正确的磁道。所有其他 R/W 磁头均被(电气)禁用。

CHS 中的 S 表示扇区地址。磁盘控制器(以编程方式)扫描每个扇区(在寻道和选择磁头之后),当它在(选定的)R/W 磁头下旋转时,直到找到请求的扇区(例如,读取扇区的 ID 记录,并执行地址比较)。

此外,
如果您熟悉维度分析,那么将磁盘驱动器的磁头数量指定为heads per cylinder比 更有意义heads per drive

我了解几何 CHS 数,但是 (3,2,1) 元组 CHS 数来自哪里?

这只是一个任意选择的 CHS 地址,用于转换为 LBA 地址的示例。

顺便提一句
用终端用户术语来说,“磁盘”==磁盘驱动器。
用专业 HDD 术语来说,“磁盘”==磁盘盘片。

答案2

以下是用 Python 实现的转换、历史怪癖和正确术语的便捷快速摘要。大写字母指定几何,小写字母指定(c,h,s)扇区地址的组成部分。

默认几何(C,H,S)结构给出了现代大磁盘在 MBR/BIOS 样式启动早期通常使用的值。

def chs(lba,C=1024,H=255,S=63):
  """
  'lba' linearly addresses sector, indexing from zero.
  'C','H','S' specify geometry - fixed for a given disk:
     1 <= C <= 1024 (10 bits)
     1 <= H <= 255  (8 bits) not 256 due to WD1010 quirk
     1 <= S <= 63   (6 Bits) not 64 due to WD1010 quirk
   Returns address as c,h,s tuple:
     0 <= c <= 1023 (10 bits) modulo C
     0 <= h <= 255  (8 bits) modulo H
     1 <= s <= 63   (6 Bits) not 64 due to WD1010 quirk
  """
  if C<1 or H<1 or S<1 or C>1024 or H>255 or S>63:
    raise ValueError, \
      "Invalid (C,H,S) geometry: ({},{},{})". \
        format(C,H,S)
  t,s = divmod(lba,S); s+=1 # tracks, sector offset
  c,h = divmod(t,H)
  if c>=C: raise ValueError, \
    "Unaddressable lba value: {} for ({},{},{}) geometry.". \
      format(lba,C,H,S)
  return (c,h,s)

def lba(c,h,s,C=1024,H=255,S=63):
  """
  'C','H','S' specify geometry as for function 'chs'.
  'c','h','s' address a sector in this geometry.
  """
  if C<1 or H<1 or S<1 or C>1024 or H>255 or S>63:
    raise ValueError, \
      "Invalid (C,H,S) geometry: ({},{},{})". \
         format(C,H,S)
  if c<0 or h<0 or s<1 or c>=C or h>=H or s>S:
    raise ValueError, \
      "Unaddressable (c,h,s) value: ({},{},{}) for ({},{},{}) geometry.". \
         format(c,h,s,C,H,S)
  return (c*H+h)*S+(s-1)

相关内容