深入理解 GNU GRUB - 03 diskboot.S 3.1 diskboot.S执行时的环境 & 3.2 diskboot.S代码结构

grub2 1.95 源码分析之一 —— boot.S 分析及注释 /* -*-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/o 阅读详情

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

 

diskboot.S位于目录boot/i386/pc/,最终生成diskboot.img。这部分指令被加载到0x8000~0x81FF。diskboot.img加载GRUB内核到0x8200开始的内存位置,并将系统控制权交给GRUB内核。用到的BIOS例程和boot.S中相同。因此本章只描述如下内容:
  1)    diskboot.S执行时的环境
  2)    diskboot.S代码结构
  3)    diskboot.S详细注释
  4)    diskboot.S模拟实现


本章最后也模拟一个diskboot的实现。

 

3.1 diskboot.S执行时的环境
boot.img跳转到bootdisk.img之前,已经配置好堆栈和一些寄存器及参数值。因此diskboot假设如下条件已经是满足的:
  1)    堆栈。SS和SP已配置好,有可用的堆栈。
  2)    寄存器DL。DL中保存正确的引导驱动器。
  3)    寄存器SI。SI中保存DAP地址。
  4)    寄存器DS。设置有正确的数据段DS。
事实上,在跳转到diskboot.img之前,boot.img确实做好了配置。堆栈SS:SP=0x0000:0x2000;DL中包含正确的引导驱动器;SI指向DAP地址,因此-1(%si)确定磁盘读取模式(LBA为1,CHS为0),如果是CHS读取,磁盘CHS参数含有正确值;数据段寄存器DS=0。

 

3.2 diskboot.S代码结构
diskboot.S生成512字节机器码,其中0x0~0x147共328字节是指令,0x148~0x1FF共184字节用来保存数据集,每个数据集占用12字节,可以保存15个数据集。对于每个数据集,其中0~7字节表示起始扇区数,在安装时候指定;8~9字节表示扇区数,10~11字节表示目的段地址,都在生成镜像(grub-mkimage)时确定。必须存在一个扇区数为0的数据集表示数据集读取结束,因此可以存在14个有效数据集。当前只使用了一个。我反解了一个安装后的diskboot.img,显示只用了一个数据集,其值如下:
  起始扇区LBA地址: 0x0000 0000 0000 0002
  扇区数: 0x002e
  目的段地址: 0x0820
可知,grub内核的起始扇区是2扇区,扇区数46(0x2E==46),加载到0x8200起始内存处。这个grub内核的大小为46*512=23KiB。
diskboot.S压栈首先保存驱动器。输出提示信息”loading”,设置第一个数据集的地址,然后进入循环读取数据。
根据boot.img中设置的读取模式(LBA/CHS)和数据集中的起始扇区、扇区数、目的段地址,读取数据并保存到内存中(偏移量为0,因此目的段地址唯一确定内存地址)。每调用一次读中断,都提示一个”.”到终端,对于慢速存储设备,用户可以快速得到反馈,以免在加载数据期间,用户误以为死机而进行强制性关机措施等。
在一个数据集内循环读取时,循环标签是LOCAL(setup_sectors),一个数据集完成后,设置处理上一数据集,并跳转到LOCAL(bootloop)开始处理,如果这个数据集的扇区数为0,则跳转到LOCAL(bootit),否则继续数据集内的循环LOCAL(setup_sectors)。
数据读取完毕后,执行LOCAL(bootit)处代码,这里将输出提示信息”/r/n”,还原DX寄存器(保存引导驱动器),并以CS:IP=0x0000:0x8200跳转执行,这里正是kernel.img所在内存地址。
BIOS读中断过程(LBA/CHS)参考boot.S中的注释,此处不再重复。

深入理解 GNU GRUB - 03 diskboot.S 3.3 diskboot.S详细注释 转载注明出处(cppgp: http://blog.csdn.net/cppgp )diskboot.S位于grub-1.98/boot/i386/pc/目录,采用AT&T汇编语法编写。详细注释如下:/* * GRUB -- GRand Unified Bootloader * Copyright (C) 1999,2000,2001,2002,2006,2007,2009,2010 Free Software Foundation, Inc. * * GRUB is fre 阅读详情

相关推荐

Halcon 20.11在WPF中的交互式绘图:完整实现矩形ROI的创建、拖动与坐标获取

本文详细介绍了如何在WPF框架下利用Halcon 20.11实现交互式矩形ROI的创建、拖动与坐标获取。通过HDrawingObject和HSmartWindowControlWPF控件,开发者可以高效构建机器视觉应用,提升项目实战中的开发效率。文章涵盖环境配置、事件处理、坐标获取及性能优化等关键内容。

weixin_29266007的博客 427

grub源码分析之diskboo.S

转载于“https://blog.csdn.net/conansonic/article/details/78482766”。 第二个扇区的代码在grub源码的diskboot.S中,下面来看。 grub-core/boot/i386/pc/diskboot.S diskboot start第一部分 _start: pushw %dx pushw %si MSG(notification_...

一点点 725

企业微信审批流开发避坑指南:从零搭建自定义审批模板(含完整代码)

本文为企业微信审批流开发提供了从零搭建自定义审批模板的完整指南。通过对比内置模板与自建引擎的优劣,详细阐述了利用企业微信开放API和自建应用实现高度灵活审批流程的方案。文章重点解析了前端JS-SDK安全调用、后端签名生成与回调处理的核心代码,并分享了流程引擎设计、安全加固及性能监控等实战经验,帮助企业开发者避开常见陷阱,构建贴合业务的自定义审批系统。

weixin_28358083的博客 965

diskboot

深入理解 GNU GRUB - 03 diskboot.S 3.1 diskboot.S执行时的环境 & 3.2 diskboot.S代码结构 分类: Bootloader2011-05-10 09:05 243人阅读 评论(0) 收藏 举报 转载注明出处(cppgp: http://blog.csdn.net/cppgp )   diskboot.S位于目录boot/i3

zeflove的专栏 1902

igh ethercat 实时性测试

组备注std(us)max(us)a无锁核,无rt补丁8.38108b锁核+FIFO调度+内存锁定,无rt补丁0.9216c锁核+FIFO调度+内存锁定,+rt补丁0.9922可以看到 a组 使用ethercat不做其他优化,周期抖动非常大,且max能达到 100 多 us;通过 锁核+FIFO调度+内存锁定 进行优化,可以看到 抖动明显降低,且max 为 20 us 左右;

qq_43353632的博客 2309

告别水印!Vue3项目集成Stimulsoft.Reports.js完整配置与激活指南

本文详细介绍了如何在Vue3项目中集成Stimulsoft.Reports.js,提供从授权策略到性能优化的完整解决方案。通过模块化架构设计和现代化引入方式,帮助开发者高效实现专业级报表功能,同时避免版权风险和水印问题,特别适合中小型项目需求。

weixin_33701294的博客 431

统信UOS提示系统磁盘空间不足,磁盘扩容

在windows系统安装统信UOS系统后,UOS里默认系统磁盘为20G,很容易就会占满磁盘,电脑会不停的提示磁盘空间不足。所以,扩容很有必要,这里记录把20G容量扩充到50G的过程。其中,50G代表的意思是我们想要把磁盘扩充到 50G。到这里,再次查看磁盘信息(df -lh),即可看到扩容成功。bs是单位 1G,conv 表示不转换;if 是输入设备,/dev/zero是空设备,表示凭空增加;(激活后)进入开发者模式,获得root权限。of 是输出设备,输入我们的虚拟磁盘文件名;以管理员身份进入控制台。

Imfondof 1万+

如何使用AKShare作为OpenBB的数据源

`openbb_akshare`项目是 OpenBB 的数据源扩展。可以用于查询A股和港股数据

FinAnalyzer金融分析工具 3195

linux系统管理——4、磁盘管理

一、磁盘结构 1.硬盘的物理结构 盘片:硬盘有多各盘片,每片2面 磁头:每面一个磁头 2.硬盘的数据结构 扇区:盘片被分为多个扇形区域,每个扇形区存放512字节的数据 磁道:统一盘片不同半径的同心圆 柱面:不同盘片同半径构成的圆柱面 3.硬盘存储容量=磁头数x磁道(柱面)数x每道扇区数x每扇区字节数 4.可以用柱面/磁头/扇区来唯一定位磁盘上的每一个区域 二、磁盘接口 1.IDE(并口) 2.SA...

weixin_45284484的博客 1163

Windows 11 安装 JDK 11:下载、安装、配置环境变量、验证

本文详细介绍了在 Windows 11 系统中安装 JDK 11 的完整流程,包括从 Oracle 官网下载压缩包、解压到自定义目录、配置 JAVA_HOME 与 Path 环境变量,并验证安装是否成功。文章还包含一个专为 JDK 11 新特性设计的测试程序,涵盖 Lambda 表达式 var 语法、HTTP 客户端 API、字符串增强方法等,帮助读者确认安装版本正确无误,适合初学者和需要多版本 JDK 共存的开发者参考。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2777

【2026年华为暑期实习(AI)-4月29日-第一题- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

本文摘要涵盖了机器学习和深度学习中的多个核心概念与技术,包括非负矩阵分解、条件数、MobileNet创新点、LDA降维、大模型评测指标、半精度训练、多任务学习、GPU存储层次、正则化、张量并行等。通过12道单选题和8道多选题的形式,系统性地考察了相关理论原理、应用场景及工程实践要点。题目设计注重概念准确性(如LDA目标函数)、技术细节(如Megatron-LM的并行策略)与实际应用(如FP16训练动机),并包含概率统计(二项分布)和数值计算(微分误差分析)等数学基础内容,全面检验读者对AI领域关键知识的掌握

m0_73659489的博客 142

深入理解 GNU GRUB - 02 boot.S 2.4 boot.S详细注释

grub 1.98 深入理解 boot.S 详细 注释

cppgp的专栏 3272

使用 MATLAB/Simulink 对基于同步发电机的双机系统进行建模,并对其在短路故障条件下的暂态稳定性进行仿真和分析

双机系统(Two-Machine System)是电力系统中用于研究动态稳定性和控制策略的一个典型模型。它由两台同步发电机通过输电网络相互连接,模拟实际电网中的互联操作。当发生短路故障时,系统的暂态稳定性会受到挑战,可能导致发电机失步或电压崩溃。本教程将带你使用 MATLAB/Simulink 对基于同步发电机的双机系统进行建模,并对其在短路故障条件下的暂态稳定性进行仿真和分析。

amy_mhd的博客 8506

打开并编辑ubuntu的root.disk文件,WinHex使用方法

使用wubi安装的ubuntu,修改fstab一下给修改坏了,然后就悲剧的无法启动了。 解决方案其实是挺多的,比如可以使用LIVE CD引导后挂载一下。 我想的最直接的办法就是在WINDOWS打开root.disk文件修改fstab不就行了嘛 于是找到一个软件叫做:WinHex 下载地址:http://download.csdn.net/detail/magic_wz/4680807 使

漫步 5626

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

MBR/BOOT和GRUB三者关系总结(系统启动过程)

MBR是硬盘上的一个扇区,包含三部分内容(引导程序、分区表及分隔标识,MBR总计512字节;其中引导程序最多占446个字节);为什么需要这个MBR,主要是因为BIOS太小,功能有限。当系统加电,bios自检后,就会将MBR Load进内存。也就意味着引导程序被激活,分区表信息已经加载到内存,同时也意味着对系统的控制权从bios过渡到GRUB.GRUB是GRand Unified Bootloade...

码农崛起 1650

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

grub源码分析之diskboot.img

同上篇boot.img生成过程类似,不再一一分析,仅记录编译过程log。 第一步:根据diskboot.S生成diskboot_image-diskboot.o文件。 【编译过程log如下】 gcc -DHAVE_CONFIG_H -I. -I…/…/grub-core -I… -Wall -W -DGRUB_MACHINE_PCBIOS=1 -DGRUB_MACHINE=I386_PC -m...

一点点 543

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

grub源码分析---1

grub源码分析

conansonic的博客 5702

grub源码分析之boot.img-Makefile

转载于 “https://blog.csdn.net/conansonic/article/details/78667939” 本章记录grub2中的boot.img是如何生成的,总结如下: 第一步:根据boot.S生成boot_image-boot.o文件。 首先在对应目录下创建.dirstamp文件,然后将boot.S汇编文件编译成boot_image-boot.o,在编译过程中,将依赖关...

一点点 1290

GRUB2 分析 (四)

接上一篇 kernel.img由startup.S以及一堆c文件编译而成。这是一个ELF格式的文件。(其实前面的boot.img、 diskboot.img、lzma_decompress.img本来也都是ELF格式文件,但是经过了精简。) kernel.img链接时,目标装载地址是0x9000,这是在Makefile.core.dep中定义的: i386_pc_ldflags= '$...

weixin_30610755的博客 308

grub2分析(转)

想了解操作系统bootloader过程原理的可以看过来,又勾起了一些项目回忆。。。 转: 一. 从开机到OS加载的简要流程:    机器加电,通过bios的0x19功能调用,加载mbr(也就是boot.img)到0x7c00位置,并跳到该地址开始执行boot.img,它会读入diskboot.img到0x8000处(也是512个字节的大小),随后跳到0x8000开始执行dis

TaLk工作室专栏 - Trace the linux kernel 2648

从零开始带你搞懂Linux系统启动流程

大体流程分析 涉及Linux的源码版本为linux-4.9.282。 系统上电,CPU首先去执行固化在ROM中的BIOS BIOS主要做硬件自检,并去启动盘的第一个扇区(MBR)加载执行BootLoader Linux系统的BootLoader这里是GRUB,可以用Grub2工具生成BootLoader代码 MBR中的boot.img会引导加载core.img中的lzma_decompress.img lzma_decompress.img中会将CPU切换至保护模式,并解压执行GRUB的内核镜像

fghklfgkhd的博客 4885

统信UOS提示系统磁盘空间不足

我的UOS是通过win10一键安装的,即win10+UOS双系统,系统信息如下df -lh当/dev/loop0的 可用空间不足的时候就会提示系统磁盘空间不足。

小蚂蚁的博客 1万+

Linux系统启动初始化

文章目录一.BIOS 加载启动引导程序二.MBR 主引导扇区三.GRUB引导内核3.1运行 boot.img3.2加载 core.img3.3切换到保护模式3.4kernel.img 引导内核四.内核初始化五.系统调用 Linux系统启动初始化的主要流程是: 1.上电BIOS自检 2.启动Boot Loader(GRUB) 3.加载内核 4.启动第一个进程 5.配置环境 一.BIOS 加载启动引导程序 BIOS(英文:Basic Input/Output System),即基本输入输出系统,亦称为ROM

肥宅快乐博客 2145

查看Linux root disk,如何在硬碟建置Linux系统之使用 bootdisk及 rootdisk 磁片 开机

安装系统的第一步骤, 就是拿刚刚制作好的 bootdisk 磁片, 塞入第一部软碟机, 启动电源。 正常的话, 您会在萤幕上看到以下画面。<< 画面 4-1 >>LILOWelcome to the Slackware Linux 2.0.2 Bootkernel disk!If you have any extra parameters to pass to the kernel, enter ...

weixin_30131105的博客 432
上一篇: 深入理解 GNU GRUB - 02 boot.S 2.5 MBR过程模拟实现
下一篇: 深入理解 GNU GRUB - 03 diskboot.S 3.3 diskboot.S详细注释
cppgp
博客等级 码龄20年 47粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值