![如何从 MBR 计算分区的起始地址](https://linux22.com/image/570132/%E5%A6%82%E4%BD%95%E4%BB%8E%20MBR%20%E8%AE%A1%E7%AE%97%E5%88%86%E5%8C%BA%E7%9A%84%E8%B5%B7%E5%A7%8B%E5%9C%B0%E5%9D%80.png)
给定一个 MBR 和 MBR/分区表的结构,如何计算每个分区的大小和起始地址?
为了澄清起见,假设我得到了这个-
答案:MBR 中显示三个分区表条目。
分区 1:起始 LBA 地址:扇区 63(十进制)。如果使用十六进制表示,起始地址为 0000003f。大小:20482812 个扇区(十进制)。如果使用十六进制表示,大小为 01388afc。
分区 2:起始 LBA 地址:扇区 20482875(十进制)。如果使用十六进制表示,起始地址为 01388b3b。大小:20482875 个扇区(十进制)。如果使用十六进制表示,大小为 01388b3b。
分区 3:起始 LBA 地址:扇区 40965750(十进制)。如果使用十六进制表示,起始地址为 02711676。大小:37142280 个扇区(十进制)。如果使用十六进制表示,大小为 0236bf08。
您是如何得出这个答案的?
答案1
我认为理解分区表的十六进制表示最困难的地方在于字节顺序问题。英特尔 PC 基于小端架构,多字节数字表示的实际字节顺序是反向的。因此 LBA 扇区偏移数字01388b3b
存储为3b8b 3801
- 它就在您的 MBR/分区表中,从 0x01dd 开始。数字紧随其后重复这一事实只是巧合 - 分区长度恰好等于分区的 LBA 偏移。
答案2
取决于操作系统、系统和文件系统格式。
维基百科是有关该主题的良好资源:http://en.wikipedia.org/wiki/Master_boot_record
开始按照布局操作。分区表条目从 000001BE 开始...带有 16 字节的分区记录...
跳过不太重要的部分...
第一个分区是 NTFS(000001C3),从 0000003f 开始(查看从 000001c6 开始的小端格式的 4 个字节),大小为 01388acf(查看从 00001ca 开始的小端格式的 4 个字节)
如果您不能阅读维基百科页面并理解它...您可能不应该这样做...或者应该在课堂上更好地学习。
答案3
分区从 1be 开始(000001BE)
要找出 1be 的位置,首先转到偏移量(偏移量是第一列)0001b0。现在在 0001b0:按十六进制计数以找到 E。例如,如果我们查看 0001b0 之后的第一组数字:0000,我们将前两位数字(00)计为 0,然后将后两位数字计为 1……继续计数,直到到达 E,即 8001(80 为“E”)。这是分区表的开头 - 它始终为 16 个字节,因此它以 3801 结束(或偏移量行 0001c0 中的倒数第二组数字)。
LBA 地址始终从 8 开始,到 11 结束。因此,如果我们查看第一个分区 (8001 – 3801) 并数到 8,我们会得到 3f00(3f 为“8”),结尾是 0000(最后两个 00 为“11”)。因此,整个 LBA 地址是 3f00 0000,但我们必须反转顺序,因为它是小端格式,而我们需要十六进制。因此,要做到这一点,请将数字分解成这样 3f 00 00 00 00
00 00 3f <-“反转”
重复此过程,直到其余分区信息为止 - 如果发现全为 0,则停止。注意:您不能拥有超过 4 个(主)分区。