哈喽,我是子牙老师,一个手写过操作系统、编程语言、Java虚拟机、docker、Ubuntu系统,玩透Windows内核、Linux内核...的硬核男人
最近在备课《实战Linux内核》四期,刚好到Linux内核中的EXT4源码这块,想着很多人没底子看不懂这块代码,把我研究的成果写成文章分享给大家。本篇文章分享的底子之一就是MBR与GPT,如果文字版你看不懂,需要看视频,可以找班主任【jvm-anan】咨询课程。
如果你喜欢看计算机底层硬核文章,欢迎关注我的公众号【硬核子牙】,都是干货硬货!
可能有小伙伴不知道MBR与GPT是什么,为此,画了一张图,帮助大家理解

还是不理解?那举个例子:你拿到一块硬盘,第一件事情是干啥,是不是给硬盘分区,MBR与GPT就是干这事的,相当于一块地,你是想分成田字形,还是N个田字形

它两区别是啥,如图

早些年的操作系统一般是使用MBR+BIOS,如今,一般是使用更为强大的GPT+UEFI。我的课程《手写操作系统》就是基于MBR+BIOS实现的。后面做的课程《手写Ubuntu Linux系统》就是基于GPT+UEFI实现的

现在你应该知道MBR与GPT是什么了,那本篇文章讲什么呢?
- MBR磁盘分区结构长啥样
- GPT磁盘分区结构长啥样
- MBR、GPT与文件系统是如何关联上的
- EXT4文件系统在MBR、GPT上是怎么玩的
- LBA是什么意思
以下,enjoy
MBR磁盘分区结构
废话不多说,直接上图,MBR磁盘分区结构长这样

你可能想问:它最多只能分四个分区吗?是也,非也!第一层它确实只能分四个分区,但是它支持一个扩展分区,逻辑分区中的分区数量是无限的

你可能想问:扩展分区只能放在最后一个吗?非也,可以放在任意位置,第一个也可以,但是一般是放最后一个
你可能还想问:在扩展分区中还能创建扩展分区吗?不可以了。技术上是可以做到的,但是这样设计可能太麻烦了吧,就没有这么去设计
你有没有这样的问题:为什么只能分四个分区?因为BIOS引导启动代码,将0扇区的512B作为启动扇区,是定死的规矩。
如何判断0扇区是不是启动扇区,就看最后两个字节,即511、512两个位置,存放的是否是0x55、0xAA。如果不是,BIOS是不运行启动代码的,那操作系统就起不来

既然是启动扇区,那得有空间存储启动代码吧!BIOS规范约定,前446B给你存放操作系统引导代码用。446B太小了,能干啥?所以一般写操作系统,这里放的只是跳转代码,所以你看写操作系统的书,一定有一节是:突破512字节瓶颈!

512-446-2,还剩多少?64B。MBR一个扇区用16B存储,刚好存4个扇区的信息。这个扇区信息存什么?扇区类型、从哪开始、到哪结束...

MBR还剩最后一个问题,如果有扩展分区,在硬盘中是如何存储的?这样

ChatGPT夸我这张图画的教科书级别,艾玛,给我夸飘了

说了这么多,如何实战呢?使用fdisk工具即可,给大家看下我实战的结果



自动进入扩展分区进行分区,即你接下来做的所有操作,都是在扩展分区中分区

写入硬盘

至此,MBR你已全部拿下!
GPT磁盘分区结构
直接上图

总结一下图中给出的信息:
一、GPT磁盘分区结构中,依然会保留MBR扇区。你可能想问,那OS怎么知道是GPT分区结构呢?MBR扇区中有一个分区项,它的类型是0xEE,OS通过这个判断这块盘是MBR还是GPT

二、第二块分区,存放的是GPT的核心信息,如图

硬盘中长这样

GPT header有备份,在LBA-1的位置,就是存储在硬盘的最后一块扇区中
三、GPT支持最多128个分区,每个分区信息占128B,128*128B=16K=32个扇区。所以存放GPT分区信息是2-33,还有备份的是LBA-33至LBA-2。GPT分区信息长这样


理论就这么多,开始做实现

这里你用fdisk也行,用gdisk也行,我就用fdisk做实验了


一共创建了四个分区,在硬盘中,刚好4个

这就是GPT磁盘分区表的全部!
2048
不知道你有没有注意,不论是MBR还是GPT,第一个分区都是从2048开始的。
没注意?那再来看看。
这是MBR的

这是GPT的

为什么呢?这个我可不知道,来问下ChatGPT

原理如此!
LBA
再来说说LBA是什么?它其实是一种磁盘坐标,32位时代用的是LBA28,64位时代用的是LBA48
与LBA相对的是CHS,就是大家听过的柱面、磁头、扇区。以前定位一个扇区,要通过这三个坐标。机械盘淘汰后,加上CHS能表达的磁盘空间有限,就改用了LBA。比如0柱面0磁头1扇区,对应的就是LBA=1

那LBA28与LBA48又是怎么回事呢?表达磁盘数量不同

我的课程《手写操作系统》,就是基于LBA28实现的

自信的说,我的课程《手写操作系统》,含金量还是非常高的!你看文章有没有发现,文中提到的大部分理论,课程中都有实战!其实也正常,OS代码在硬盘中,你不读硬盘,怎么价值OS代码呢?那你不知道这些,又怎么写读硬盘的代码呢?我还是觉得,学《手写操作系统》,对于每个coder来说,都非常非常重要!