在 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 地址。3150
1020,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)