深入理解 GNU GRUB - 02 boot.S 2.2 MBR结构 2.3 boot.S代码结构

深入理解 GNU GRUB - 02 boot.S 2.5 MBR过程模拟实现 2.5 MBR过程模拟实现 现在,我们对系统引导的第一步已经有了一个详细的认识。为了更深一步的理解MBR和这些BIOS调用,提供一些测试题目:   1)    开机后在屏幕上输出”Hello cppgp”,并在一定时间后重复输出。   2)    开机后紧跟着读取第二个扇区,并且显示整个扇区512字节到屏幕上。 实现上述功能,编译生成512字节的IMG文件,设置虚拟机通过软盘引导,选择使用软盘镜像文件,设置镜像文件为我们编译生成的IMG文件,就可进行测试。 下文首先简单介绍虚拟机配置,然后实现上述 阅读详情

转载注明出处(cppgp: http://blog.youkuaiyun.com/cppgp )

 

2.2 MBR结构
历史悠久的MBR结构自从IBM兼容PC出现以来一直就没变过(但是为支持2TiB以上硬盘而出现的GUID/EFI结构将更改MBR结构)。MBR结构分为三部分,分别是引导指令、分区表DPT (Disk Partition Table)、幻数Magic (Magic=0x55AA)。其中引导指令占用446字节(0~0x1BD),DPT占用64字节(0x1BE~0x1FD),Magic占用2字节。
Magic值总是等于0x55AA,用来标记MBR的有效性。大多数BIOS检测Magic值判断是否为可引导设备,但是也有些BIOS使用另外的字段检测。在所有的小端设备上(例如80x86机器),在写入时需要设置为0xAA55。
DPT是硬盘分区表(Disk Partition Table)的缩写。MBR支持4个基本分区项,每个分区项占用16字节。可以将其中一个基本分区项标记为扩展分区(逻辑分区),扩展分区的第一个扇区称为EBR (Extended Boot Record) ,和MBR有类似的结构,但是只能利用两个基本分区项,其中一个用来划分分区,另一个指向新的EBR,这样就可以实现更多的分区。每个分区项的布局完全一致,如下:
偏移量        字节数        描述
0x00        1        分区状态,
0x80为可引导分区
0x00为不可引导分区
其他值无效
0x01        3        该分区第一个扇区CHS地址,格式见稍后描述
0x04        1        分区文件系统格式,比如NTFS/FAT32/Linux等
0x05        3        该分区最后一个扇区CHS地址,格式见稍后描述
0x08        4        该分区第一个扇区的绝对LBA地址
                          表示从磁盘开始到该分区的扇区数
0x0C        4        该分区的扇区数量

3字节的CHS地址结构如下:
偏移量            描述
0x00            磁头
0x01            低6位表示扇区,高2位表示柱面的9~10位
0x04            柱面的低8位

对于CHS结构还有疑问者,查阅2.1.4的CHS模式读可加强理解。因为CHS寻址有7.88GiB限制,现在的硬盘一般都是用LBA寻址,因此分区表中有用的字段是状态字段(0x00)、分区格式(0x03)、扇区偏移量(0x08~0x0B)和扇区数量(0x0C~0x0x0F)。我在虚拟机上测试过,清零硬盘分区的起始CHS地址和结束CHS地址不会导致错误。
446字节的引导指令负责加载另外的磁盘数据,进而引导整个系统。而这也正是boot.S所完成的功能。1.3节的内容大概介绍了加载磁盘数据的过程,而后文的boot.S代码结构分析和详细注释展示具体的实现过程。

2.3 boot.S代码结构
boot.S生成512字节的机器码,其中0x0~0x1BD (0~445) 共446字节是磁盘(硬盘/软盘)均可能用到的指令;0x1BE~0x1FD (446~510) 共64字节指令是软盘读取需要的指令,完成软盘驱动器复位、读取;0x1F~0x1FF (511~512) 是标识字段为0x 55AA(小端上需要表述为0xAA55)。GRUB安装程序判断存储媒介是硬盘或软盘。如果是硬盘,写入0x0~0x1BD和0x1FE~0x1FF两个字段。如果是软盘则写入整个MBR(512字节)。下面先简单介绍代码对指令位置的安排,其中0x7C**是指MBR加载到内存后对应指令所在的内存地址。
boot.S首先是一个跳转指令和一个空指令,占用3字节空间(0x7C00~0x7C03)。
之后保留一字节空间(0x7C04),后续代码保存BIOS调用探测到的读模式(LBA/CHS)到这里。执行到GRUB的第二步时还会使用这里保存的读模式标记。
之后是BIOS参数块BPB (BIOS parameter block)所在空间,共保留0x56(0x7C04~0x7C59)字节,当前只用到开始的16字节。BPB首字节(0x7C04)用来保存BIOS调用探测到的读模式(LBA/CHS),执行到GRUB的第二步时还会使用这里保存的读模式标记。接下来的16字节(0x7C05~0x7C14)用作BIOS LBA读调用的DAP(参见2.1.2),这16个字节是和CHS参数块是复用的,如果是CHS,则用作保存BIOS调用获取的驱动器CHS参数,后来的CHS读扇区用它判定扇区是否越界。
之后是2字节的跳转指令(0x7C5A~0x7C5B),加载完毕后跳向此处执行,因为jmp不支持立即数,因此保存在这里,值为0x8000。
之后是8字节的GRUB内核起始扇区LBA地址(0x7C5C~0x7C63),注意顺序,首先是低4字节,然后是高4字节。默认值为低4字节0x01,高4字节0x00,即磁盘的第二个绝对扇区。
之后是一字节的驱动器(0x7C64),默认设置为0xFF,安装时候改写成正确的引导驱动器,如果代码中探测到依然是0xFF,则会赋默认驱动器0x80(第一块硬盘编号)。
之后关闭中断,检测磁盘驱动器,设置寄存器,设置堆栈,打开中断,使用BIOS例程判断读取模式,读取磁盘数据,保存读取模式(保存到mode即0x7C04位置),最后设置正确的寄存器,然后跳转到第二步执行。
0x1BE~0x1FD是只针对软盘读取的指令。这些指令不会安装到硬盘MBR(硬盘上这里是DPT区域,写入DPT会破坏分区)。
0x1FE~0x1FF保存标识数0xAA55(0x1FE值为0x55,0x1FF值为0xAA,注意0xAA55是针对小端序处理器的)。
下面是编译(未安装)的grub-1.98/boot.S的二进制码:


下面是安装以后的MBR内内容:


对照可以看出,DPT部分是有差异的,这是因为boot.S编译后的指令码中这部分是软盘复位和读指令,而硬盘MBR中保存DPT。正如同前文所述,我尝试把DPT中CHS地址相关的部分给置0后,测试GRUB仍然正常工作(偏移量是)。
另外一个差异是0x7DB8~0x7DBE空间的6个字节,boot.S注释说是为了兼容Windows NT,因为Windows NT在这里插入了一个幻数,我尝试把这6个字节(偏移量0x1B8~0x1BD)置0,经测试GRUB是可以正常工作的。
8字节的GRUB内核安装扇区也一样,是因为我的虚拟机的GRUB内核确实安装在第二个扇区,如果是和Windows共存的双系统安装,这8字节可能会有所差异(需要指向实际的安装扇区)。
MBR中Windows NT幻数和DPT中CHS地址部分清的指令如下:


上述指令清零Windows NT兼容幻数,以及硬盘第一基本分区、第二基本分区的起始和结束CHS地址。如果你使用多系统(Windows/Linux/Etc.)请谨慎运行。

深入理解 GNU GRUB - 02 boot.S 2.1 相关BIOS例程 转载注明出处(cppgp: http://blog.csdn.net/cppgp)。2. boot.S: GRUB引导第一步 boot.S位于目录boot/i386/pc/。这部分指令被加载到0x7C00~0x7DFF。主要工作包括:配置寄存器;设置堆栈;检测引导盘;检测引导盘读取模式;读取另一扇区指令。这个过程用到几个BIOS例程,并且对主引导记录(MBR, Master Boot Record)结构有很大的依赖。因此boot.S我们分作四步进行详细描述: 1)    相关BIOS例程 2)    阅读详情

相关推荐

双系统/移动硬盘安装Ubuntu后Grub引导丢失?一个update-grub命令的完整修复流程

本文详细解析了双系统或移动硬盘安装Ubuntu后Grub引导丢失的问题,提供了从应急手动引导到永久修复的完整流程。重点介绍了`update-grub`命令的使用方法,以及针对UEFI/BIOS不同模式的修复策略,帮助用户快速恢复系统启动功能。

weixin_30435261的博客 352

Linux的引导过程与服务控制(启动类故障解决)

所有的操作系统在开机的时候都会有引导过程,那在Linux操作系统中的引导过程中是如何的呢?如果我们在开机的时候系统出现一些故障导致开机启动不了,我们应该如何针对不同的故障进行解决?开机自检(BIOS)----MBR引导----GRUB菜单----加载内核(kernel)----init进程初始化...

S314118142的博客 688

告别Grub救援模式:一份给Linux小白的Grub修复指南(附Boot-Repair用法)

本文详细介绍了如何从Grub救援模式恢复Linux系统的两种方法:手动命令修复和使用Boot-Repair工具的一键恢复。针对常见的Grub启动引导修复问题,提供了从基础命令解析到完整修复步骤的实战指南,帮助Linux新手快速解决系统启动问题。

weixin_27966471的博客 322

Grub的概述

按下开机键后,程序员能控制的第一个程序并不是内核,而是引导器程序GRUB

懒猫的脚印 1528

NXP Layerscape平台UEFI与安全启动实践指南

在嵌入式系统开发中,引导加载程序是系统启动的基石,负责硬件初始化与操作系统加载。其核心原理在于建立从硬件上电到应用运行的完整执行链。随着系统安全需求日益严苛,安全启动技术应运而生,它通过密码学验证构建了一条不可篡改的信任链,确保每一级固件和代码的完整性与真实性,这对于网络通信、工业控制和边缘计算等关键领域具有极高的技术价值。本文聚焦于NXP Layerscape系列高性能处理器平台,深入解析如何将标准化的UEFI固件接口与硬件级安全启动机制深度融合,提供了从开发环境搭建、镜像链构建、Flash烧写到安全策略

chiyingliao3565的博客 398

Ubuntu binary镜像:可验证、可复现的Linux交付标准

Linux发行版的二进制镜像,是操作系统交付的核心形态,其本质是经过统一构建、密码学签名与哈希校验的确定性字节流。它基于标准化构建链(如debootstrap+gcc+qemu)、固化工具链版本,并依托SquashFS、ISO 9660等格式实现跨平台可启动性。相比源码分发,binary形态保障了部署一致性、安全可追溯性与基础设施即代码(IaC)的工程底线。广泛应用于服务器裸金属安装、云平台镜像(cloudimg)、容器基础镜像(ubuntu:24.04)及Ubuntu Core原子更新等场景。理解bina

445

grub2的mbr分析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33800593的博客 572

Ubuntu下C语言开发环境搭建:从系统安装到项目实战

C语言作为系统编程和嵌入式开发的核心,其学习效率高度依赖于开发环境。在Linux操作系统上进行C语言开发,能够直接接触GCC编译器、GDB调试器等底层工具链,有助于深入理解程序编译、链接和执行的原理。这种贴近硬件的开发方式,对于掌握内存管理、指针操作等核心概念具有不可替代的价值。无论是操作系统开发、驱动编写,还是高性能服务器编程,基于Linux的C语言环境都是行业标准实践。本文以Ubuntu系统为例,详细演示如何从零开始配置一个完整的C语言开发环境,涵盖系统安装、GCC编译器套件配置、VSCode编辑器集成

weixin_30920853的博客 354

Linux——操作系统引导过程

引导过程一、Linux操作系统引导过程1.1 引导过程讲解1.2 init进程(CentOS6)1.3 Systemd进程(CentOS7)1.4 Systemd单元1.5 运行级别对应的systemd1.5.1 查看target单元类型1.5.2 查看当前系统默认启动target1.5.3 设置默认启动target1.6 systemd服务管理二、排除启动类故障 一、Linux操作系统引导过程 1.1 引导过程讲解 linux引导过程一般包括以下几个阶段: 开机自检 、 MBR 引导 、GRUB 菜单 、

Kiro君的博客 1970

第03章 引导启动程序(1):bootsect.s 完整解析——512 字节里的“创世魔法”

它没有用到任何高深的算法,完全依靠对底层硬件(BIOS 中断)、内存寻址(实模式段偏移)和磁盘结构(磁道、磁头、扇区)的深刻理解。软盘知识小科普:一张 1.44MB 的软盘,有 80 个磁道(柱面),每个磁道有 2 个磁头(0 和 1),每个磁道每个磁头下有 18 个扇区(每扇区 512 字节)。在一片漆黑的物理世界里,CPU(中央处理器)复位,它的程序计数器被强行设置为 0xFFFF0。运行这个模拟器,你会真切地感受到,一个操作系统不是“凭空被解压”的,而是。这个距离内核的最终目的地足够远,不会被波及。

weixin_42108533的博客 543

一文讲透3GPP TS 36.104发射链路相关指标

3GPP是制定移动通信标准的国际组织,其36.104规范对LTE基站射频性能提出详细要求。规范主要涵盖七方面:1)基站输出功率分类标准;2)LTE信道带宽计算方法;3)TD-LTE特有的发射机关断功率及时延要求;4)信号质量指标(频率误差和EVM)及其影响因素;5)邻道泄漏比(ACLR)的45dBc标准;6)带内频谱辐射模板(OBUE)的噪声限制;7)9kHz-12.75GHz频段的带外杂散辐射要求。这些技术要求保障了LTE基站的射频性能和网络质量。

weixin_49761275的博客 4526

linux引导过程与服务控制

1、开机自检 服务器主机开机以后,将根据主板BIOS 中的设置对CPU、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统拉制权,大多时候会移交给本机硬盘。 总结:检测出第一个能够引导系统的设备比如硬盘或光驱、u盘2.MBR引导 当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中MBR 《Master Boot Record,主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据MBR记录中的引导信息调用启动菜单(如GRUB)。 总结:运行放在MBR扇区里的启动

weixin_69343040的博客 149

Anaconda报错no qt platform plugin could be initialized

今天因为在anaconda中安装了一个新包,安装成功后运行python 程序报错:no qt platform plugin could be initialized。 1.安装Anaconda3-4.2.0-Windows-x86_64,对应python版本为3.5.2,scikit learn版本是0.17。因为要用Isolation Forest算法,只有0.18以上版本scikit learn才包含此算法,所以想更新scikit learn。 conda install scikit-lear

zhang1806618的博客 1万+

boot.S代码结构

深入理解 GNU GRUB - 02 boot.S 2.2 MBR结构 2.3 boot.S代码结构 分类: Bootloader2011-04-25 11:05 252人阅读 评论(0) 收藏 举报 转载注明出处(cppgp: http://blog.csdn.net/cppgp )   2.2 MBR结构  历史悠久的MBR结构自从IBM兼容PC出现以来一直就没变过(

zeflove的专栏 988

数据库迁移策略实战:MySQL到PostgreSQL

数据库迁移是一项复杂且细致的任务,需要充分的准备工作、合适的迁移策略和严格的验证与优化步骤。通过选择合适的迁移工具、进行手动迁移和应用程序适配、以及迁移后的验证与优化,可以确保数据迁移的成功和业务的连续性。希望本文的分享能够为大家在MySQL到PostgreSQL的数据库迁移实战中提供一些有用的参考和启示。

shejizuopin的博客 1730

【宠物识别系统】设计框架

能跑通的 Demo。收集 10,000 张同品种但不同个体的图片。训练ArcFace模型,验证准确率能否达到 99% 以上。搭建Milvus向量数据库。开发移动端 App/小程序。加入“图像质量检测”和“用户反馈纠错”功能。你是更偏向于做软件服务(如寻宠App、保险API),还是做软硬结合的产品(如智能喂食器)?这决定了我们下一步是深挖云端高并发架构,还是边缘端模型压缩。更偏向于软件,应用更广泛些,继续既然专注于纯软件/SaaS (Software as a Service) 方向。

百态·数智思维 | 聚焦大数据、量化与未来AI 1413

grub 和 中断解析

深入理解 GNU GRUB - 02 boot.S 2.1 相关BIOS例程 分类: Bootloader2011-04-25 10:59 252人阅读 评论(0) 收藏 举报 转载注明出处(cppgp: http://blog.csdn.net/cppgp )   2. boot.S: GRUB引导第一步  boot.S位于目录boot/i386/pc/。这部分指令被加

zeflove的专栏 1005

px3 有感分析

px3 后续分析

qq_39707917的博客 3115

Ventoy:重新定义多系统启动盘的技术架构与实现原理

Ventoy是一款革命性的开源启动盘制作工具,它彻底改变了传统U盘启动盘的工作模式。传统方法中,每个ISO镜像都需要单独写入U盘并格式化,而Ventoy允许用户将多个ISO/WIM/IMG/VHD(x)/EFI文件直接复制到U盘中,通过智能引导技术实现按需启动。该项目支持x86 Legacy BIOS、IA32 UEFI、x86_64 UEFI、ARM64 UEFI和MIPS64EL UEFI等多

gitblog_01120的博客 415

手把手教学:用国产GLM-4.6替代Claude4.0,实现AI自动化编程全流程

本文提供了一份详细的教程,指导开发者使用国产GLM-4.6模型替代Claude 4.0,实现AI自动化编程。内容涵盖从获取API密钥、搭建本地环境、改造Claude Code工具到实战开发与VSCode集成的全流程,旨在帮助用户低成本、高效率地体验AI自主编程。

weixin_29070861的博客 553

wsl2内核版本和模块版本不一致解决方法

** /lib/modules/…build: No such file or directory错误解决办法这篇文章历时1个月整,从4月5日一直到5月5日,这一问题才得以解决。

m0_60634555的博客 5103

goalng开发_开发篇

Go 面试,基础知识

qq_46640341的博客 1159

【推荐100个unity插件】动画重定向,快速在不同角色间共享动画,共用非人形Humanoid(泛型generic)动画——Retarget Pro

Retarget Pro是一款高效的Unity动画重定向工具,可快速在不同角色间共享动画。主要特点包括:1分钟快速设置,支持编辑器和运行时重定向;适用于人形、动物、武器等各类角色;提供基础重定向、IK重定向和FPS专用重定向三种功能模块;通过Rig组件和骨架资产实现骨骼链匹配,支持批量处理。插件包含示例项目和预设资源,操作简便且效果优于Unity原生Humanoid系统,特别适合处理手指等精细动画。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 545

Linux系统引导过程及排除启动故障(详细)

文章目录一、Linux操作系统引导过程二、系统初始化进程1、init进程2、Systemd3、Systemd单元类型二、排除启动类故障1、修复MBR扇区故障 一、Linux操作系统引导过程 1.开机自检 服务器主机开机以后,将根据主板BIOS中的设置对CPU、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制权,大多时候会移交给本机硬盘。 总结:检测出第一个能够引导系统的设备,比如硬盘或者光驱 2.MBR 引导 当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中MBR(主引导记录)

愿你成为自己喜欢的模样,不抱怨,不将就,有自由,有光芒! 1945

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MRB中的GRUB引导程序遭到破坏该怎么去处理修复

输入1 进入急救模式,加载光盘镜像,切换到系统根环境。输入grub2-mkconfig -o /boot/grub2/grub.cfg。错误点:grub.conf文件丢失、引导配置有误。输入chroot /mnt/sysimage。重置虚拟机时 按esc进入引导界 选择3进入。系统引导停滞,显示“grub>”提示符。打开虚拟机编辑器,使用ISO硬像文件。生成 Grub2 配置文件。

m0_59332472的博客 310

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Grub源码分析

GRUB整体分析总体上我们可以把GRUB看成一个微型的操作系统,他有Shell,支持Script,有文件系统……我们可以把Stage1和Stage1.5看成一个引导程序,而Stage2则是一个操作系统,只不过这个操作系统是专门用来引导其他操作系统的操作系统,为此,Stage2支持像kernel,initrd,chainloader等等为此目的而设置的内部“命令”。3.1  GRUB引导操作系统的两

DanXer的Linux专栏 6226

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 深入理解 GNU GRUB - 02 boot.S 2.1 相关BIOS例程
下一篇: 深入理解 GNU GRUB - 02 boot.S 2.4 boot.S详细注释
cppgp
博客等级 码龄20年 47粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值