grub2 1.95 源码分析之一 —— boot.S 分析及注释

修改GRUB2源码与编译安装流程 能进来这个文章的,基本也不需要我介绍GRUB是什么了。 如果我们需要GRUB的源代码,或者把我们自己编写的模块加入GRUB中,我们要怎么做呢? 首先我们创建一个目录,下载并解压grub的源码。 mkdir grub cd grub wget ftp://ftp.gnu.org/gnu/grub/grub-2.04.tar.gz tar zxvf grub-2.04.tar.gz 然后我们就可以得到这样的目录 不知道为什么,有时候直接把文件拖进虚拟机,这个文件夹会丢失很多文件(就算是压缩包也会在里面丢 阅读详情

/* -*-Asm-*- */
/*
 *  GRUB  --  GRand Unified Bootloader
 *  Copyright (C) 1999,2000,2001,2002,2005,2006  Free Software Foundation, Inc.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

// cppgp 注释版
// 转载请注明原作者
// 注释版本号 : 1.00
// 日期 : 2008-01-22
// 联系方式 :
// email yanyg02@163.com
// msn  yanyg02@hotmail.com
// qq  281607998

// boot.S 流程及功能简介 :
// boot.S 生成 512 字节的机器码存储在硬盘或者软盘的 MBR 中 , 被 BIOS 加载
// 到内存 0x7C00 处 , 然后 BIOS 设置 CPU 跳转至 0x7C00 处开始执行 , 控制权到了
// boot.S 手中 . boot.S 根据 BIOS 设置的寄存器初始值和一些 INT 中断调用 , 判断
// 引导驱动器是 LBA硬盘/CHS硬盘/软盘 中的哪一种 , 并保存磁盘参数到磁盘参数块地
// 址(BPB) , 然后读取由 kernel_sector 处的 8 字节确定的扇区块 ( 即diskboot.img
// 由 bootdisk.S 生成的二进制码文件 )内存储的 512 字节的内容到内存地址 0x70000
// 处 , 再拷贝到内存 0x8000 处 , 然后跳转至 0x8000 开始执行 , 由 bootdisk.S 获
// 得控制权 , 而 boot.S 就功成身退了. 但是 boot.S 设置的实模式下的堆栈及寄
// 存器值,以及引导驱动器的模式和参数 , 在 bootdisk.S 中都有用到 . 具体请看代码
// 注释及 diskboot.S 的注释 . 如果在加载 diskboot.img 的过程中出错, 则输出错误
// 提示信息 , 进入死循环 , 等待手工重起或者关闭.
// boot.S 生成的机器码被加载在 0x7C00~0x7DFF 处, 具体机器码见文档最后部分


// 这个头文件里面只定义了一个版本号
#include <grub/boot.h>

// 这个头文件即../.././include/grub/i386/pc/boot.h , 定义引导需要的系统常量定义
#include <grub/machine/boot.h>

// 在代码中使用宏的地方 , 我都做了宏的说明 , 读者不需要跟踪到对应 .h 文件中看宏定义

/*
 *  defines for the code go here
 */

/* Absolute addresses
   This makes the assembler generate the address without support
   from the linker. (ELF can't relocate 16-bit addresses!)
*/

// ABS(x)计算x的绝对地址,用来生成不受连接器限制的地址(ELF不能生成可重入的地址).
#define ABS(x) (x-_start+0x7c00)

/* Print message string */
// 打印 x 指向的字符串到终端
#define MSG(x) movw $ABS(x), %si; call message

/* XXX: binutils-2.9.1.0.x doesn't produce a short opcode for this. */
#define MOV_MEM_TO_AL(x) .byte 0xa0;  .word x
// binutils-2.9.1.0.x不能生成short操作码,使用这个宏传递x给AL
 
 .file "boot.S"

 .text

/* Tell GAS to generate 16-bit instructions so that this code works
   in real mode.
*/
// 告知GAS生成16位的指令,使以下代码可以工作在实模式下
// 说明 : GAS是gcc的汇编器

 .code16

// 以下代码被BIOS启动例程加载至0X7C00处并且跳转到此处执行,过程描述如下:
// (为降低分析复杂度,我们假设从硬盘启动.)
// BIOS读取硬盘的MBR扇区共512字节,并放在地址0X0000:0X7C00处
// 跳转到0X0000:0X7C00处去执行
// 此时设置寄存器如下:
// CS:IP = 0X0000:0X7C00 !即代码段基址为0,偏移量为0X7C00
// ES:SI   !指向BIOS中硬盘分区表的地址.
// DL   !引导设备number,00x80~0xFF

.globl _start; _start:
 /*
  * _start is loaded at 0x7c00 and is jumped to with CS:IP 0:0x7c00
  */

 /*
  * Beginning of the sector is compatible with the FAT/HPFS BIOS
  * parameter block.
  */
 // 扇区开始处和BIOS参数块都是FAT/HPFS格式兼容的.

 // 跳转到after_BPB内存处
 jmp after_BPB
 nop /* do I care about this ??? */
 // nop 永远不会执行!

 /*
  * This space is for the BIOS parameter block!!!!  Don't change
  * the first jump, nor start the code anywhere but right after
  * this area.
  */
 // 以下空间是留给BIOS参数块的!!!
 // 不要更改跳转指令
 // 除了恰在BIOS参数块后的位置,也不要开始执行指令

 . = _start + 4
 // 保留空间 : 使本节代码占用的空间到_start+4处.如下分析:
 // jmp after_BPB  占用2字节
 // nop   占用1字节
 // 因此多保留一字节地址并以0填充.
 // 事实上,在生成的.img文件中,开始处四字节的机器码是:eb4b9000
 // Address  0x7C00  0x7C01  0x7C02  0x7C03
 // Value  eb  4b  90  00
 // Operator jmp  sfter_BPB nop  00

 /* scratch space */
 //保留的空间
 //占用 4 字节 , _start+0x00 ~ _start+0x03

// 磁盘信息参数块
// CHS 寻址方式用到 11 字节 _start+0x04 ~ _start+0x0E
// mode = 0 ; 然后依次是通过 BIOS INT 0x13 , AH = 0x08 调用得来的"扇区/磁头/柱面"参数
// LBA 寻址方式用到 16 字节 _start+0x04 ~ _start+0x14
// mode = 1 ; 然后会通过此后数据块的值和调用要求填充磁盘参数块
// 此时 , 诸如 sectors/heads/cylinders 等标签是无用的 , 具体参数格式见 lba_mode 一节对代码的注释

mode:
 .byte 0
disk_address_packet:
sectors:
 .long 0
heads:
 .long 0
cylinders:
 .word 0

sector_start:
 .byte 0
head_start:
 .byte 0
cylinder_start:
 .word 0
 /* more space... */

 . = _start + GRUB_BOOT_MACHINE_BPB_END
 //保留空间

 /*
  * End of BIOS parameter block.
  */
 //BIOS参数块结束地址

// 现在,空间已经分配到了_start + GRUB_BOOT_MACHINE_BPB_END
// 其中
// 数据空间是 : _start+0x04 ~ _start+0x12
// 保留空间是 : _start+0x13 ~ _start+0x3D

// grub自身信息保存地址:
// 共 14 字节 : _start + 0x3E ~ _start + 0x4B
// boot_version !版本
// kernel_address !内核加载地址
// kernel_segment !内核加载段地址
// kernel_sector !扇区绝对地址,默认为0磁头0柱面1扇区
// boot_drive !从哪个磁盘加载,0xff表示使用boot驱动器加载
boot_version:
 .byte GRUB_BOOT_VERSION_MAJOR, GRUB_BOOT_VERSION_MINOR
 //  4   0
kernel_address:
 .word GRUB_BOOT_MACHINE_KERNEL_ADDR
 //  0x8000
kernel_segment:
 .word GRUB_BOOT_MACHINE_KERNEL_SEG
 //  0x800
kernel_sector:
 .long 1, 0
boot_drive:
 .byte 0xff /* the disk to load kernel from */
   /* 0xff means use the boot drive */

after_BPB:

/* general setup */

 // 首先屏蔽掉一切可屏蔽的中断!
 cli  /* we're not safe here! */

        /*
         * This is a workaround for buggy BIOSes which d

深入理解 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)    阅读详情

相关推荐

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

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

GRUB源代码分析.pdf

GRUB源代码分析.pdf

GRUB2启动详解.pdf

GRUB2启动详解.pdf

改进差分进化算法及其求解柔性作业车间调度问题(Python代码实现)

内容概要:本文系统探讨了改进差分进化算法在求解柔性作业车间调度问题中的应用,并结合Python代码实现,展示了该算法相较于传统方法在全局搜索能力和收敛速度方面的优势。研究不仅聚焦于算法本身的改进策略,如变异、交叉和选择操作的优化,还深入分析了其在复杂制造环境中应对多目标、多约束调度问题的有效性。文中通过标准测试实例验证了算法性能,并与其他智能优化算法进行了对比分析,体现了其在实际工程应用中的潜力。此外,文档还关联了多无人机路径规划、电力系统状态估计、微电网优化、图像与信号处理等多个前沿技术领域,展现了智能优化算法在跨学科工程仿真与决策支持中的广泛适用性。; 适合人群:具备一定编程基础和工程背景,从事智能制造、自动化、工业工程、电气工程、控制科学与工程、计算机科学及相关领域的科研人员、高校研究生及企业研发技术人员。; 使用场景及目标:①为科研工作者提供可复现的智能优化算法代码框架,支持柔性作业车间调度、多无人机协同路径规划、电力系统优化等复杂工程问题的建模仿真;②辅助完成学术论文复现、课程设计、毕业设计或科研项目开发;③推动智能算法在生产调度、能源管理、交通规划等实际场景中的落地应用。; 阅读建议:建议读者结合文中提供的算法原理与代码实现,动手调试并验证不同参数设置对优化结果的影响,同时可参考荔枝科研社提供的完整资源包进行扩展学习与实践,以加深对算法机制与工程应用的理解。

电力系统实时仿真技术:从硬件在环到主流平台实践

实时仿真是一种基于高性能计算硬件,在严格时间约束下模拟物理系统动态行为的关键技术。其核心原理在于通过硬实时计算,确保仿真步长内的模型求解与输出时间严格同步,从而构建高保真的虚拟测试环境。这项技术的核心价值在于为电力电子、新能源并网等复杂系统的研发提供了无风险的“数字沙盘”,能够安全地验证控制器逻辑、保护装置动作及系统稳定性。在工程实践中,硬件在环测试通过连接虚拟模型与真实硬件,形成了控制器硬件在环和功率硬件在环两大主流应用场景,广泛应用于设备研发、电网安全分析和人员培训。本文聚焦于电力系统领域,深入解析了实

weixin_30952479的博客 420

基于CNN网络的轴承故障诊断

内容参考:《基于卷积神经网络的轴承故障 诊断算法研究》–张伟 代码参考: https://github.com/AaronCosmos/wdcnn_bearning_fault_diagnosis 1 背景: 基于信号处理的特征提取+分类器的传统智能诊断算法,对专家经验要求高,设计耗时且不能保证通用性,已经不能满足机械大数据的要求。提出使用基于卷积神经网络智能诊断算法来自动完成特征提取以及故障识别。 1.1 挑战 机电产品故障诊断面临的挑战,有三大特点: (1)数据量大,专业分析人员的数量严重不足,仅依靠人

weixin_45679938的博客 7万+

运行 ui5 serve 命令行报错的处理方法

如果大家运行 ui5 serve 命令行,报如下的错误消息: ui5 不是内部或外部命令,也不是可运行的程序: 只需要执行命令行,全局安装 ui5 cli(command line interface)这个命令行工具即可: npm install --global @ui5/cli 这个 ui5 cli 的入口执行文件,实际安装在了我 Node.js 的安装目录下: 更多Jerry的原创文章,尽在:“汪子熙”: ...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1340

【第33话:车辆控制】自动驾驶车辆运动学模型推导及详解

自动驾驶车辆的运动学模型以自行车模型为核心,通过状态方程。

一碗白开水一 830

MyBatis-Plus 实战:敏感字段自动加解密支持模糊查询

本文基于MyBatis-Plus框架提出了一种全链路敏感字段加密方案。通过自定义TypeHandler实现数据入库自动加密和查询自动解密,结合重写LambdaQueryWrapper处理查询条件加密,并适配多种查询方式。方案核心包括:1)AESUtil工具类提供加解密基础能力;2)EncryptTypeHandler实现字段类型转换;3)实体类通过注解配置加密字段。该方案在保证数据安全的同时,对业务代码侵入性小,支持姓名、手机号等敏感信息的全流程加密处理,满足系统开发的安全需求。

蔡定努 595

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

data+scenario+science+insight 645

【入门AUTOSAR网络管理测试】CANoe测试T_WakeUp时间

随着智能电动汽车行业的快速发展,目前AUTOSAR网络管理也得到了广泛应用,AUTOSAR网络管理测试也是汽车网络测试中非常重要的环节,NM问题导致的汽车ECU不能唤醒、电瓶亏电等问题,对于新入门AUTOSAR网络管理测试的同学不清楚如何开展测试,那么本章节就主要给大家介绍网络管理中T_WakeUp时间如何测试。【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读。

测试领域技术分享 2135

Java调用OpenDDS(2)-理解OpenDDS自带的Messager示例

理解Messenger

zhangzl419 1660

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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...

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: STL源码分析之一 : 迭代器详解
下一篇: GCC编译 --- 起步
cppgp
博客等级 码龄20年 47粉丝 46原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值