为什么磁盘分区的时候,第一个分区前面总有一段空间(63或者2048个扇区)

背景

不论是MBR分区还是GPT分区,第一个分区的前面总有一段空闲的空间(除了MBR之外的空间),这段空间不属于任何分区。

这一段空间的意义

早期的操作系统对应的分区工具在分区的时候,其第一个分区总是63号扇区开始的,意味着在第一个分区之前总是有63个扇区,除了MBR扇区,其他的扇区都是空闲扇区。

This odd number is an artifact of cylinder-head-sector (CHS) addressing used in INT 13h, the legacy BIOS API used for disk access. On legacy systems and bootloaders that used the INT 13h API, all partitions must begin and end on cylinder boundaries. Even after logical block addressing (LBA) was introduced, fake CHS values (which did not correspond to the actual disk geometry) were used to maintain compatibility with the legacy API. Since CHS addressing originally supported a maximum of 63 sectors per cylinder, the first partition would begin on sector 63. Windows XP (before Service Pack 3) and earlier versions of Windows will not boot if the system volume isn't on a cylinder boundary.

从上面的引用可以看出,在最开始的BIOS中,INT13h的磁盘访问中断服务(早期的磁盘访问都通过该服务)要求磁盘分区必须是按照进行分配的,所以在早期磁盘的分区就必须按照柱面进行分配,即分区的以柱面对齐。对于早期磁盘来说,一个柱面上的某个盘面正好对应一条磁道,一条磁道上刚好有63个扇区,如果按照柱面分配,由于第一个扇区是MBR,所以那一个磁道上的所有扇区都不能分配给第一个分区,第一个分区必须从第二条磁道开始分配,导致第一个分区前面有一段空闲的扇区,这些扇区不属于任何分区。

后来磁盘引入了LBA寻址,磁盘的物理几何模型已经与CHS不相符了,但是为了保证兼容性,第一个分区之前依然要保留63个扇区,LBA0为MBR扇区,第一个分区从LBA63开始。这就是历史上的BIOS对磁盘分区的影响。

但是,随着磁盘容量越来越大,一些磁盘厂商的开始提供物理扇区为4KiB大小的磁盘,为了提高对磁盘的访问性能,分区就必须按照4KiB大小的物理扇区对齐进行访问,否则就会降低访问性能。

为什么不按照4KiB大小的物理扇区对齐进行分区就会造成性能访问损失呢?

对于物理扇区为4KiB的硬盘,其对外仍然提供逻辑扇区访问(LBA访问仍然是按照512Bytes大小寻址),逻辑扇区大小为512bytes。所谓逻辑扇区访问,其实就是将一个4KiB大小的物理扇区分成8份,8*512Bytes=4096Bytes。

当需要访问其中一个逻辑扇区并写入数据的时候,就需要先读出一个物理扇区,然后将物理扇区中其他逻辑扇区的数据与现在写入的逻辑扇区的数据进行整合,然后再写入这个物理扇区,这就造成一次逻辑扇区数据写入就需要先读再写,于是每次写入都多了一次读取数据与修改数据的过程,这就降低了写入性能,这被称为RMW(Read-Modify-Write)性能损失。

现代操作系统以及一些底层的磁盘访问软件,都已经支持4KiB的磁盘的访问了,当遇到磁盘的物理扇区大小为4KiB的时候,每次对磁盘的数据访问就会按照4KiB进行读写。

假设现在分区没有按照4KiB对齐,第一个分区从LBA63开始,则第8个物理扇区的最后1/8部分被分到了第一个分区,当操作系统访问第一个分区的时候,就会从该分区的第一个逻辑扇区开始访问,按照4KiB进行磁盘的数据读写,这就势必造成RMW性能损失,所以为了保证对这种磁盘的正常访问性能,磁盘分区就必须按照4KiB大小进行对齐。

那么,如果仍然按照原来的分区方式,第一个分区从LBA63开始,由于63不是8的倍数,使得分区没有按照4KiB进行对齐,于是就会造成RMW的性能损失问题。现代操作系统建议第一个分区从LBA2048开始,前面正好预留1MiB的空闲空间,2048正好是8的倍数,于是分区4KiB对齐了。

现代操作系统默认安装的时候,其第一个分区正好从LBA2048开始,不论是MBR分区还是GPT分区方式,都是如此。例如,windows和linux,它们在默认安装的时候,第一个分区都是从LBA2048开始的,而且假如使用其默认的分区工具,第一个分区默认也是从LBA2048开始的,当然用户使用分区工具分区的时候,可以自行指定第一个分区开始的位置,当然必须保证4KiB对齐。

个人觉得,直接默认就好。

至此,这一段空间为什么存在的原因完全理清了。

  • BIOS影响导致第一个分区从LBA63开始。
  • 4KiB对齐影响导致第一个分区从LBA2048开始。

对于linux来说,其使用grub进行引导,grub会充分利用这一段空闲的空间,其会将自身引导程序的一部分写入到这一段空间之中(MBR分区下是这样的,GPT分区下不是这样的。GPT分区下会将这一部分内容写入到另外的地方。),这是真节省呀。

磁盘分区方式对比(MBR与GPT)_lengye7的博客-CSDN博客

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算每个分区表在整个磁盘的开始扇区号、结束扇区号和总扇区数,需要先了解一下磁盘分区表的结构。 磁盘分区表是存储在磁盘的第一个扇区(也称为主引导记录)中的一段数据,它描述了磁盘上所有分区的信息。主引导记录的大小为512字节,其中前446字节为引导程序,后64字节为分区表,最后两个字节为主引导记录的结束标志。 在分区表中,每个分区表项占用16个字节,其中包含了该分区的起始扇区号、扇区数、分区类型等信息。因此,要计算每个分区表在整个磁盘的开始扇区号、结束扇区号和总扇区数,步骤如下: 1. 读取磁盘的主引导记录,找到分区表的起始位置。 2. 遍历分区表,对于每个分区,计算其起始扇区号、总扇区数和结束扇区号。其中起始扇区号为该分区的起始LBA(逻辑块地址),总扇区数为该分区扇区数,结束扇区号为起始扇区号加上总扇区数减1。 3. 对于每个分区,累加其总扇区数,得到整个磁盘的总扇区数。 4. 对于每个分区,需要将其起始扇区号转换为相对于整个磁盘的扇区号。因为在分区表中,起始扇区号是相对于主引导记录的偏移量,而不是相对于整个磁盘的偏移量。因此,需要加上主引导记录的扇区数,才能得到相对于整个磁盘的扇区号。 5. 将每个分区的起始扇区号、结束扇区号和总扇区数记录下来,即可计算每个分区表在整个磁盘的开始扇区号、结束扇区号和总扇区数。 需要注意的是,以上计算方法适用于MBR(主引导记录)分区表,而GPT(GUID分区表)的计算方法略有不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值