try ai
科普
编辑
分享
反馈
  • 逻辑块寻址

逻辑块寻址

SciencePedia玻尔百科
核心要点
  • LBA 通过用一个单一、线性的编号块序列取代复杂的物理 CHS 几何结构,简化了磁盘访问。
  • 操作系统利用 LBA 抽象的“泄露”特性(即相邻的 LBA 在物理上通常是接近的)来优化 I/O 性能。
  • 从 MBR 中的 32 位 LBA 迁移到 GPT 中的 64 位 LBA,对于突破现代驱动器的 2 TiB 存储限制至关重要。
  • 通过 LBA 将文件系统块与底层物理结构对齐,对于最大化 SSD 的性能和耐久性至关重要。

引言

现代计算机是如何在内部结构迥异的设备上(从旋转的机械磁盘到无声的固态硬盘)管理数 TB 数据的?答案在于一种强大而优雅的抽象,它充当了数据存储的通用语言。这种抽象将巨大的物理复杂性隐藏在一个简单、线性的数字序列背后,使得从引导操作系统到管理庞大的服务器集群等一切成为可能。

然而,情况并非总是如此。早期的存储系统是根据其物理机制进行寻址的——一种由柱面、磁头和扇区(Cylinder-Head-Sector, CHS)组成的系统。随着技术的发展,这种系统变得越来越笨拙和不准确。这种机械模型的局限性为提高存储容量和性能制造了巨大障碍,迫使人们寻求一种新的方法。

本文将探讨解决这一问题的概念:逻辑块寻址(Logical Block Addressing, LBA)。在第一节​​原理与机制​​中,我们将从 CHS 的机械世界走向 LBA 的抽象模型,理解为何这种改变是必要的以及 LBA 是如何工作的。随后,在​​应用与跨学科联系​​一节中,我们将展示这一基本概念是如何应用于整个计算技术栈,影响着从引导过程、分区对齐到高级文件系统和现代存储阵列设计的方方面面。

原理与机制

要理解现代存储的精妙之处,我们必须首先回到一个更机械化的时代。想象一下,一个硬盘不再是一个神秘的黑匣子,而是一个微型唱片机——一堆涂有磁性材料的旋转盘片,还有一个被称为“执行器”的精密悬臂,用于将读写磁头定位在盘片表面。要找到一条数据,你需要告诉机器三件事:使用哪个盘片和表面(​​磁头 Head​​),将悬臂从中心移开多远(​​柱面 Cylinder​​),以及一旦磁头就位后要读取哪个数据块(​​扇区 Sector​​)。

机械地址:柱面、磁头和扇区的世界

这种物理的、三维的描述催生了第一个主要的寻址方案:​​柱面-磁头-扇区(CHS)​​。这是最自然的思考方式。给计算机一个像 (C,H,S)(C, H, S)(C,H,S) 这样的 CHS 地址,就像给一个出租车司机地址一样:“去 400 号柱面,找到 123 号磁头,然后在 42 号扇区停下。”

为了将这个由三部分组成的地址转换为计算机更容易使用的单一线性数字,你基本上需要计算出它之前的所有扇区。你需要计算出柱面 CCC 之前所有柱面的扇区总数,加上当前柱面中(在前面磁头下的)所有磁道的扇区数,最后加上当前磁道中扇区 SSS 之前的扇区数。这就得到了一个类似这样的公式:

LBA=(C×Heads_per_Cylinder×Sectors_per_Track)+(H×Sectors_per_Track)+(S−1)\text{LBA} = (C \times \text{Heads\_per\_Cylinder} \times \text{Sectors\_per\_Track}) + (H \times \text{Sectors\_per\_Track}) + (S - 1)LBA=(C×Heads_per_Cylinder×Sectors_per_Track)+(H×Sectors_per_Track)+(S−1)

注意末尾那个小小的“−1-1−1”。这是一个历史怪癖!由于某些早已被遗忘的原因,工程师们决定从 0 开始计算柱面和磁头,但从 1 开始计算扇区。只要硬盘的几何结构是统一且可预测的——也就是说,只要每个盘片上的每条磁道都具有完全相同数量的扇区,这个简单的公式就工作得很好。在一段时间里,这个简单的机械模型就是事实。但随着技术的飞速发展,这个事实变成了一个善意的谎言。

当几何结构成为谎言

CHS 寻址那美好而有序的世界建立在刚性、统一的几何结构基础之上。但是,工程师们在不懈追求更大存储容量的过程中,粉碎了这个基础。

首先是​​区位记录(Zone Bit Recording, ZBR)​​。一个观察旋转盘片的工程师会注意到,最外圈的磁道在物理上比最内圈的磁道要长得多。如果每条磁道扇区数固定,就意味着外圈磁道上的磁性比特位分布得非常稀疏,浪费了宝贵的空间。解决方案简单而巧妙:将盘片分成几个同心“区”,并在更长的外圈磁道中封装更多的扇区。一个驱动器可能在其最外区每磁道有 800 个扇区,但在其最内区只有 600 个。突然之间,我们简单 CHS 公式中的“每磁道扇区数”不再是一个常数。几何结构不再统一,CHS 模型开始崩溃。

其次,现实世界是混乱的。没有完美的制造过程,每个硬盘盘片都有微小的缺陷。为了处理这个问题,驱动器内置了备用扇区。当驱动器的内部控制器检测到一个“坏”扇区时,它会透明地重新映射它,将未来对该扇区的任何请求重定向到其中一个备用扇区。这对可靠性来说是一个极好的特性,但它对 CHS 模型是又一次打击。扇区的逻辑序列不再对应于盘片上的物理序列。一个本应是下一个扇区的请求,可能会被悄悄地重定向到一个完全不同柱面上的备用扇区。

最后的、决定性的一击来自​​固态硬盘(Solid-State Drives, SSDs)​​的发明。这些设备没有盘片,没有磁头,没有柱面,也没有传统意义上的扇区。它们由闪存芯片构成,具有由页和块组成的复杂内部架构。对于 SSD 来说,“柱面”和“磁头”这两个概念完全没有意义。

CHS 模型被打破了。它不再能描述硬件的物理现实。继续使用它就像用一张 17 世纪的地图在现代城市中导航。一张新地图是必需的。

优雅的抽象:简单的块序列

这张新地图被称为​​逻辑块寻址(Logical Block Addressing, LBA)​​。LBA 背后的思想极其简单:停止尝试描述驱动器复杂、隐藏且不断变化的物理几何结构。取而代之的是,将整个驱动器视为一个单一的一维块数组,从 000 到 N−1N-1N−1 顺序编号,其中 NNN 是驱动器上的总块数。这就像把所有盘片上的所有扇区首尾相连,形成一长串连续的珠子。

在这个模型下,操作系统不再需要知道任何关于柱面、磁头或区的信息。它只需发出一个请求:“请给我逻辑块 1,512,331 中的数据”。这个简单、抽象的请求被发送到驱动器的板载控制器。该控制器作为驱动器的大脑,维护着真实物理布局的秘密、复杂的地图。它了解所有关于区、重映射的坏扇区以及设备的专有内部工作原理。它接收简单的 LBA 编号,并将其转换为数据的精确物理位置,这是一项它完全胜任的任务。

这种抽象是如此彻底,以至于现代驱动器仍在报告 CHS 值,这只是为了向后兼容而进行的一种礼貌性的虚构。它们报告的 CHS 几何结构是一种“伪造”或“转换”的几何结构,与驱动器的物理性质毫无相似之处。任何试图根据这些遗留数字推断性能的尝试都注定会失败,实验一致表明了这一点。例如,人们可能期望位于低 LBA(因此是低“柱面”号)的数据比高 LBA 的数据快得多,但测试可能会发现它们的性能几乎相同。这是因为驱动器从 LBA 到物理位置的内部映射可能是高度非线性的。CHS 地址是机器中的一个幽灵。

机器中的幽灵:利用抽象提升性能

现在,你可能会认为,通过隐藏物理几何结构,LBA 阻止了操作系统做出智能决策来优化性能。毕竟,如果操作系统不知道磁头在哪里,它如何能最小化它们的移动呢?但故事在这里变得微妙而有趣。这种抽象以一种最美妙的方式“泄露”了信息。

虽然确切的映射是保密的,但驱动器制造商通常确保 LBA 编号与物理布局是​​单调​​的。这意味着相邻的 LBA 通常对应于磁盘上物理上相邻的位置。更重要的是,较低的 LBA 编号通常映射到速度更快、靠外的磁道,而较高的 LBA 编号则映射到速度较慢、靠内的磁道。

这个保存在 LBA 序列中的“几何幽灵”正是操作系统所需要的。操作系统可以实现一种磁盘调度算法,比如“电梯”算法,它按 LBA 编号对挂起的 I/O 请求进行排序。通过按 LBA 升序(然后降序)处理请求,磁盘磁头在盘片表面上进行长而平滑的扫描,而不是疯狂地来回跳跃。这极大地减少了​​寻道时间​​——即移动磁头所花费的时间——并提高了整体吞吐量。系统管理员长期以来一直使用这一原则来提高性能,他们将频繁访问的“热”数据放在位于低 LBA 范围的分区上,以利用物理外圈磁道上更高的数据传输率。

然而,这种抽象并非完美平滑。因为 LBA 被设计成连续的,它掩盖了硬件中的物理不连续性。想象一下一个区的最后一个扇区 LBA LLL,和下一个区的第一个扇区 LBA L+1L+1L+1。对操作系统来说,它们是邻居。但在物理上,LBA LLL 可能在柱面 2499,磁头 7 上,而 LBA L+1L+1L+1 在柱面 2500,磁头 0 上。要顺序访问它们,既需要一次小的寻道(从一个柱面到下一个),也需要一次磁头切换。这会在数据流中产生一个微小但可测量的性能损失,一个“嗝”,正好发生在区边界处。一个精明的系统设计者甚至可能会规划大型数据结构(如日志和数据区域)的布局,使其与这些区边界策略性地对齐,以管理性能特性。

数字的暴政:扩展地址空间

LBA 解决了复杂几何结构的问题,但它很快就遇到了一个新问题:数字的暴政。在广泛使用的​​主引导记录(Master Boot Record, MBR)​​分区方案中,LBA 地址被存储为一个 ​​32 位​​整数。一个 32 位数字可以表示 2322^{32}232 个唯一值。如果每个块(扇区)是标准的 512 字节(292^929 字节),那么总可寻址容量是:

Capacity=232 sectors×29bytessector=241 bytes\text{Capacity} = 2^{32} \text{ sectors} \times 2^9 \frac{\text{bytes}}{\text{sector}} = 2^{41} \text{ bytes}Capacity=232 sectors×29sectorbytes​=241 bytes

这正好是 ​​2 tebibytes (TiB)​​。在 1980 年代,这似乎是一个大得不可思议的存储量。但到了 2010 年代,这成了一个严重的限制。你可以买一个 3 TiB 的驱动器,但一个使用 MBR 的旧系统只能看到并使用它的前 2 TiB。

解决方案是一个新的分区标准,​​GUID 分区表(GUID Partition Table, GPT)​​,它是为新一代固件​​统一可扩展固件接口(Unified Extensible Firmware Interface, UEFI)​​设计的,UEFI 取代了古老的 BIOS。GPT 的解决方案很简单:为 LBA 使用一个 ​​64 位​​整数。

从 32 位到 64 位的跃升不仅仅是翻倍;它是一次指数级的爆炸。新的限制是 2642^{64}264 个扇区,对于 512 字节的扇区,这相当于 8 ZB(zettabytes)——数十亿 TB。这一变化有效地消除了可预见未来的容量限制。为了确保平稳过渡,GPT 磁盘在其第一个块上包含一个“保护性 MBR”。对于旧的 BIOS 系统,这个 MBR 使磁盘看起来像一个单一的、已满的分区,保护它不被意外覆盖。对于现代 UEFI 系统,这是一个指示牌,表明真正、功能更强大的 GPT 数据结构就在其中。

从一个笨拙的机械地址到一个简单的数字串,从一个 32 位数字到一个 64 位数字,逻辑块寻址的故事完美地诠释了抽象在工程中的力量。它展示了一个简单、优雅的想法如何能够隐藏巨大的复杂性,实现高性能,并扩展以满足数字世界不断增长的需求。

应用与跨学科联系

在理解了逻辑块寻址(LBA)的优雅原理——将复杂的三维磁盘几何结构转变为简单的一维块列表——之后,我们现在可以踏上一段旅程,去看看这个强大的思想将我们带向何方。孤立地欣赏一种抽象是一回事;而在实践中看到它,见证这个单一、统一的概念如何成为构建整个现代数据存储大厦的基石,则是另一件远为深刻得多的事。从计算机启动的那一刻起,到海量服务器集群中数据的复杂舞蹈,LBA 的幽灵始终存在,安静而高效地履行着它的职责。

生命之火:引导、分区与恢复

当你按下电源按钮时,计算机是如何知道该做什么的?它没有自己的思想;必须有人告诉它从哪里开始读取指令。LBA 方案使这至关重要的第一步变得异常简单。计算机的原始固件——基本输入/输出系统(BIOS)——被硬编码了一条单一指令:“读取逻辑块地址 0 上的任何内容。”就是这样。LBA 0 是指定的起跑线,是主引导记录(MBR)所在的地方。

这个 MBR 包含一个微小的程序,一个第一阶段引导加载程序,以及一张称为分区表的磁盘地图。有一个有趣的历史怪癖,磁盘上的第一个分区通常不是从 LBA 1 开始的。为了保持与旧惯例的兼容性,通常会将其从 LBA 63 开始。这在 LBA 1 到 LBA 62 之间留下了一小片未使用的“无人区”。对于 MBR 的微小程​​序来说,这是一个多么完美的地方,可以用来存储一个稍大的第二阶段引导加载程序!第一阶段加载程序的唯一工作就是将一个连续的块(比如说从 LBA 1 开始)读入内存,然后跳转到它。LBA 的线性、可预测特性使得这变得微不足道;加载程序只需请求一个块序列,而无需知道任何关于柱面或磁头的信息。

随着磁盘容量的增长,旧的 MBR 分区方案变得过于受限。它的现代继承者,GUID 分区表(GPT),应运而生,但它仍然向 LBA 的基础性作用致敬。GPT 磁盘巧妙地在 LBA 0 处放置了一个“保护性 MBR”。对于旧系统,这看起来像一个类型未知(0xEE0x\mathrm{EE}0xEE)的单一巨型分区,从而保护了磁盘的真实内容。对于现代系统,这是一个信号,告诉它去别处寻找。真正的地图始于一个主 GPT 头,它总是位于 LBA 1 这个众所周知的地址。这个头以及紧随其后的分区条目数组,定义了磁盘的布局。为了防止损坏,这份元数据的完整备份副本被放置在磁盘的最末端。

在这里,我们看到了 LBA 在提供弹性方面的简单之美。磁盘的末端在哪里?它就是最高的 LBA 编号。如果数据恢复工具发现 LBA 1 处的主 GPT 头已损坏,它确切地知道去哪里寻找备份:最后一个 LBA。没有涉及几何的复杂计算;它只是线路的终点。这种由 LBA 实现的可预测、冗余的结构,是现代可靠磁盘分区的基石。

性能物理学:逻辑与现实的交汇

LBA 模型是一个逻辑抽象,但存储设备是一个受物理定律支配的物理对象。系统设计的真正天才之处在于理解两者之间的相互作用。同一个 LBA 编号对于性能可能意味着截然不同的事情,具体取决于设备。

在经典的机械硬盘驱动器(HDD)上,盘片以恒定的角速度旋转。盘片外边缘的磁道在物理上比中心附近的磁道更长。为了利用这一点,工程师们使用一种称为区位记录的技术,将更多的扇区封装到外圈磁道上。这对 LBA 意味着什么?磁盘制造商通常将最低的 LBA 编号(如 LBA 0)映射到速度快、密度高的外圈磁道。

现在,再次想象一下我们的引导过程。对于读取微小的 512 字节 MBR 来说,位置无关紧要。时间完全由机械延迟主导——等待盘片旋转到正确位置所花费的毫秒。但是对于下一阶段,当引导加载程序需要加载数兆字节的操作系统文件时,这种布局就变得至关重要。将这些大文件放在分区的开头,而分区本身又处于低 LBA,意味着读写头在磁盘最快的部分上空飞行。这可以为你的启动时间节省宝贵的几秒钟。LBA 的逻辑顺序被巧妙地映射到物理几何结构上,以榨取最大的性能。

固态硬盘(SSD)没有移动部件,但它们有自己的物理特性。SSD 由“页”(可以写入的最小单元)和“擦除块”(可以擦除的最小单元)组成。一个关键规则是你不能简单地覆盖一个页;你必须先擦除它所属的整个块。这导致了一种称为​​写入放大​​的现象:操作系统的一次逻辑写入可能会导致 SSD 执行多次内部写入,以便在擦除块之前将有效数据复制出来。

最小化这种情况的关键是​​对齐​​。想象一个使用 4096 字节块的文件系统。如果它在一个使用 512 字节扇区的驱动器上,将分区从一个像 LBA 63 这样的传统地址开始,那么分区的第一个字节位于偏移量 63×512=3225663 \times 512 = 3225663×512=32256 处。这个地址不是 4096 的倍数。这意味着文件系统的每一次 4096 字节的写入都会跨越两个底层 512 字节扇区之间的边界。在 SSD 上,如果这些文件系统块与物理擦除块未对齐,一次逻辑写入可能会跨越两个物理块,可能使 SSD 需要做的工作量加倍。通过为我们的分区选择一个作为擦除块大小倍数的起始 LBA,我们确保了我们的逻辑写入能整齐地 फिट入物理边界内。这种选择正确起始 LBA 的简单行为可以显著减少写入放大,从而提高驱动器的性能和寿命。

奠定基础:文件系统、阵列与算法

有了可靠且高性能的块设备抽象,我们就可以构建更高级别的系统了。

文件系统如何跟踪数十亿可用块中哪些正在使用?最简单、最有效的方法之一是​​位图​​:一长串比特位,每个 LBA 在磁盘上对应一位。LBA 98,765 是否空闲?文件系统执行一次快速的整数除法来找到位图数组中持有该比特的字,再进行一次模运算来找到该比特在该字中的位置。LBA 的线性、连续特性完美地映射到数组的线性结构上,使得空闲空间管理极其高效。

这个概念延伸到复杂的存储阵列。一个 RAID(独立磁盘冗余阵列)系统将多个物理磁盘整合起来,并向操作系统呈现为一个单一、巨大的 LBA 空间。但在这里,对齐问题再次出现。在 RAID 5 中,数据以“条带”形式跨磁盘写入。操作系统发出的一次未对齐且恰好跨越条带边界的小型写入,可能会导致灾难性的性能下降。系统被迫执行两次这样的周期,每个被写入触及的条带一次,而不是在单个条带上进行一次高效的读-修改-写周期(成本为 4 次 I/O 操作),从而使成本翻倍至 8 次 I/O 操作。

逻辑数据结构与底层 LBA 空间之间的联系甚至可以更加紧密。考虑一个存储在 SSD 上的哈希表。当一个条目被删除时,我们通常会留下一个“墓碑”标记,以确保搜索仍然能正常工作。这个槽现在在逻辑上被应用程序视为未使用。我们能告诉 SSD 这一点吗?不能直接,也不能针对单个微小的槽。但我们可以设计我们的应用程序成为一个好公民。我们可以定期重建哈希表,只将活动的条目复制到一个新位置。旧的、现在被废弃的表的整个 LBA 范围都是空闲的。然后我们可以为这个大的、连续的 LBA 范围向 SSD 发出单个 TRIM 命令。这个强大的提示告诉 SSD 内部的闪存转换层(FTL),这个空间是垃圾,使其可以在下一次清理周期中更有效地回收物理页。这是一个协作设计的美丽例子,其中应用程序理解 LBA 接口的性质,并与之协作以改善底层存储的健康状况。

未来是分区的:LBA 的持续演进

存储的世界并非一成不变。新技术不断涌现,我们的抽象也必须随之演进。像分区命名空间(ZNS)SSD 和叠瓦式磁记录(SMR)驱动器这样的设备,对经典的 LBA 模型提出了挑战。在这些设备上,LBA 空间被划分为大的“区”,每个区都必须顺序写入,就像一盘磁带。你不能回去覆盖区中间的一个块;你只能追加到它当前的写入指针。

这并不意味着 LBA 已经过时。相反,这种抽象正在被丰富。操作系统再也不能将 LBA 空间视为一个统一的、可随机写入的草稿板。它必须变得“分区感知”。在这种设备上,一个智能的文件系统可能会将整个区专用于大型、顺序写入的文件。对于小的、看似随机的写入,它可能会将它们全部打包到几个充当日志的特殊区中。这种工作负载的隔离对于遵守设备的物理约束和避免灾难性的性能损失至关重要。

这种演进甚至改变了我们对调度的看法。在 NVMe SSD 上,那些旨在最小化读/写磁头物理移动的旧磁盘调度算法是无用的。新的游戏规则是最小化写入放大。一个现代的调度器可以分析一个待处理的写入队列。它可能会注意到一组写入都指向一个小的、连续的 LBA 范围——这很可能是“热”数据,很快会被再次覆盖。其他写入可能分散在各处——很可能是“冷”数据,只写入一次就不再变动。通过重新排序请求以将所有热写入组合在一起,调度器确保它们被写入到 SSD 上的同一个物理擦除块。这个块将很快充满失效数据,使得垃圾收集器回收它变得极其廉价。像 C-SCAN 这样的算法,曾用于确保公平地扫描旋转盘片,如今以新的目的重生:按 LBA 对写入进行排序,以按温度隔离数据,这是在一个新的物理背景下对经典思想的绝妙再利用。

从简化磁盘寻址的卑微起点开始,逻辑块寻址已被证明是计算机科学中最持久、用途最广的抽象之一。它是一个好想法力量的证明——简单、清晰且可扩展。它为数十年的创新提供了稳定的基础,并持续适应,证明了即使存储的物理世界变得越来越复杂,管理它的道路也始于一个简单而优雅的步骤:从零开始计数。