硬盘第一关:MBR VS GPT

哈喽,我是子牙老师,一个手写过操作系统、编程语言、Java虚拟机、docker、Ubuntu系统,玩透Windows内核、Linux内核...的硬核男人

最近在备课《实战Linux内核》四期,刚好到Linux内核中的EXT4源码这块,想着很多人没底子看不懂这块代码,把我研究的成果写成文章分享给大家。本篇文章分享的底子之一就是MBR与GPT,如果文字版你看不懂,需要看视频,欢迎看我【个人简介】详细了解。

可能有小伙伴不知道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来说,都非常非常重要!

如果你对上面的内容感兴趣,想看我之前的文章及我的奋斗历程。白手起家程序员的职场心得,欢迎看我【个人简介】详细了解。

相关推荐
tokepson7 小时前
Mysql下载部署方法备份(Windows/Linux)
linux·服务器·windows·mysql
zz_nj9 小时前
工作的环境
linux·运维·服务器
极客先躯9 小时前
如何自动提取Git指定时间段的修改文件?Win/Linux双平台解决方案
linux·git·elasticsearch
suijishengchengde10 小时前
****LINUX时间同步配置*****
linux·运维
qiuqyue10 小时前
基于虹软Linux Pro SDK的多路RTSP流并发接入、解码与帧级处理实践
linux·运维·网络
切糕师学AI11 小时前
Linux 操作系统简介
linux
南烟斋..11 小时前
GDB调试核心指南
linux·服务器
爱跑马的程序员11 小时前
Linux 如何查看文件夹的大小(du、df、ls、find)
linux·运维·ubuntu
oMcLin14 小时前
如何在 Ubuntu 22.04 LTS 上部署并优化 Magento 电商平台,提升高并发请求的响应速度与稳定性?
linux·运维·ubuntu
Qinti_mm14 小时前
Linux io_uring:高性能异步I/O革命
linux·i/o·io_uring