4. 分区大小计算:扇区、柱面、磁头概念、容量计算公式、对齐原则
分区大小计算,听起来像是纯数学题。但你要是真拿计算器按完就往烧录器里填,十有八九要翻车。我最早做嵌入式存储时,就吃过这个亏——算出来的地址烧进去,系统死活起不来。后来才发现,是没搞懂硬盘和 Flash 的物理结构。
这一节,咱们把扇区、柱面、磁头这些老古董概念捋清楚。别嫌它们老,现在的 eMMC、NAND Flash,底层逻辑还是这套东西。
4.1 扇区、柱面、磁头——三个基本概念
先说说这三个词到底指什么。
- 扇区(Sector):存储设备的最小可寻址单元。传统硬盘是 512 字节,现在主流是 4K 扇区。Flash 里叫页(Page),但逻辑一样。
- 磁头(Head):读写数据的物理头。一个盘面一个磁头。多盘片硬盘就有多个磁头。
- 柱面(Cylinder):所有盘面上同一半径的磁道集合。说白了,就是磁头不动,盘片转一圈能读到的所有磁道。
这三者组合起来,就是 CHS 寻址方式。公式很简单:
总容量 = 柱面数 × 磁头数 × 扇区数 × 每扇区字节数
举个例子。一个老硬盘参数:柱面 1024,磁头 16,扇区 63,每扇区 512 字节。算一下:
1024 × 16 × 63 × 512 = 528,482,304 字节 ≈ 504 MB
嗯,正好是当年经典的 504 MB 限制。我在一个工控项目里遇到过这个坑——换了个大硬盘,BIOS 只认 504 MB,折腾半天才发现是 CHS 寻址上限。
核心要点:CHS 寻址最大支持 1024 柱面 × 255 磁头 × 63 扇区 × 512 字节 ≈ 8.4 GB。超过这个容量,必须用 LBA 逻辑块寻址。
4.2 容量计算公式——从 CHS 到 LBA
LBA 寻址把物理结构抽象了。每个扇区给一个逻辑编号,从 0 开始。公式变得简单:
总容量 = LBA 扇区总数 × 每扇区字节数
比如一个 32 GB 的 eMMC,LBA 总数是 62,500,000,每扇区 512 字节:
62,500,000 × 512 = 32,000,000,000 字节 ≈ 29.8 GiB
注意单位换算。厂商用十进制(1 GB = 1,000,000,000 字节),系统用二进制(1 GiB = 1,073,741,824 字节)。所以 32 GB 的卡,在系统里显示 29.8 GiB 是正常的。我见过有人因为这个找售后,说容量缩水——其实不是。
| 单位 | 十进制值 | 二进制值 | 常见场景 |
|---|---|---|---|
| 1 KB | 1,000 字节 | 1,024 字节 | 硬盘厂商标称 |
| 1 MB | 1,000,000 字节 | 1,048,576 字节 | 内存容量 |
| 1 GB | 1,000,000,000 字节 | 1,073,741,824 字节 | Flash 芯片标称 |
我的习惯:做分区表时,统一用字节为单位计算。最后再换算成 MB 或 GB。这样不容易漏掉零头。
4.3 对齐原则——为什么不能随便算
分区起始地址必须对齐到某个边界。为什么?
现代存储设备(尤其是 SSD 和 eMMC)的物理擦除块大小,通常是 512 KB 或 1 MB。如果分区起始地址没对齐到擦除块边界,写一个小文件就可能触发两个擦除块的操作。性能直接腰斩。
我遇到过最典型的案例:一个客户用 SD 卡做数据采集,写入速度只有标称的 1/3。查了半天,发现分区起始扇区是 63(老式对齐),而卡的物理页大小是 512 KB。63 × 512 字节 = 31.5 KB,完全没对齐。改成 2048 扇区(1 MB 对齐)后,速度恢复正常。
对齐原则就一句话:
分区起始地址必须是物理擦除块大小的整数倍。
具体做法:
- 1 MB 对齐:起始扇区号能被 2048 整除(2048 × 512 字节 = 1 MB)。这是最通用的做法。
- 4 MB 对齐:起始扇区号能被 8192 整除。适合大块 NAND Flash。
- 64 KB 对齐:老设备或小容量 Flash 用。起始扇区号能被 128 整除。
举个例子。你要分一个 256 MB 的 boot 分区,从 LBA 0 开始,1 MB 对齐:
起始 LBA:0(对齐)
结束 LBA:0 + (256 × 1024 × 1024) / 512 - 1 = 524,287
分区大小:524,288 个扇区 × 512 字节 = 256 MB
注意,结束地址要减 1。不然就多算了一个扇区。
曾经踩过的坑:我在一个项目里用脚本自动计算分区大小,忘了减 1。结果分区表和实际写入区域重叠,系统启动时直接挂掉。从那以后,我每次算完都会手动验证:结束地址 - 起始地址 + 1 = 扇区总数。
4.4 知识体系图
下面这张图把本节的核心逻辑串起来了。从物理结构到计算公式,再到对齐原则,一条线走到底。
从图里能看出来,扇区、磁头、柱面是底层物理概念,CHS 公式把它们串起来。LBA 是逻辑抽象,让计算更简单。最后对齐原则是实践中的硬约束——算得再准,不对齐也是白搭。
4.5 实战建议
做分区表时,我一般按这个步骤来:
- 查设备参数:拿到 Flash 或硬盘的 datasheet,找到物理擦除块大小、页大小、LBA 总数。
- 确定对齐边界:优先 1 MB 对齐。如果设备特殊(比如小容量 SPI Flash),用 64 KB 对齐。
- 计算分区大小:用字节算,最后转成扇区数。确保起始地址是对齐边界的整数倍。
- 验证:手动算一遍结束地址,确认 (结束 - 起始 + 1) × 扇区大小 = 预期容量。
- 写入烧录工具:填地址时,再检查一遍单位。有些工具用扇区号,有些用字节偏移,搞混了就是砖。
一个小工具:我习惯用 Python 写个脚本,输入分区大小和起始地址,自动算出对齐后的扇区范围。省得每次手算,还容易出错。
分区大小计算,说白了就是物理结构、数学公式、对齐约束三件事。搞懂了,后面烧录地址设置就是水到渠成的事。