硬盘第一关:MBR VS GPT


哈喽,我是子牙老师,一个手写过操作系统、编程语言、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是什么了,那本篇文章讲什么呢?

  1. MBR磁盘分区结构长啥样
  2. GPT磁盘分区结构长啥样
  3. MBR、GPT与文件系统是如何关联上的
  4. EXT4文件系统在MBR、GPT上是怎么玩的
  5. 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来说,都非常非常重要!

相关推荐
HLC++12 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室13 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy15 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕16 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫17 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生17 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1119 小时前
linux基础IO
linux·运维·服务器
BelongPanda21 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯21 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983421 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器