grub-0.97源码分析(1)

grub 0.97 在操作系统启动的初期,首先将PC指向磁盘的第一个块。这个区域大小为512字节,被称作MBR。这512字节组织性很好,包含了一些磁盘的基本参数和一些用于启动的代码。当然启动初期和文件系统是毫不相干的,因为文件系统和启动存在一个鸡生蛋和蛋生鸡的问题。举个很简单的例子,系统启动需要通过磁盘读取相应的执行文件,假如需要通文件系统来读取系统加载文件的话,那么先要找到文件系统以及文件系统依赖项。然而要找到文件 阅读详情
 
#include <stage1.h>
 
#define ABS(x) (x-_start+0x7c00)    //计算物理地址,不依赖编译器
 /* Print message string */
#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 //这个不用管它,只是为了实现兼容性用了机器码
 
 .file "stage1.S"
 .text
 .code16
.globl _start; _start:
 jmp after_BPB
 nop /* do I care about this ??? */
 . = _start + 4            //跳过上面两条指令
 /* scratch space  BIOS参数的定义*/
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 + STAGE1_BPBEND
 /*
  * End of BIOS parameter block.
  */
/*与启动有关的参数的定义*/
stage1_version: 
 .byte COMPAT_VERSION_MAJOR, COMPAT_VERSION_MINOR
boot_drive: 
 .byte GRUB_INVALID_DRIVE /* the disk to load stage2 from */
force_lba:
 .byte 0
stage2_address:
 .word 0x8000
stage2_sector:
 .long 1
stage2_segment:
 .word 0x800
after_BPB:
/* general setup */
 cli  /* we're not safe here! */
 
boot_drive_check:    /*这段代码有什么用? jmp 1f 后面的代码能执行吗?我没看明白*/
 jmp 1f
 testb $0x80, %dl
 jnz 1f
 movb $0x80, %dl
1: 
 /*
  * ljmp to the next instruction because some bogus BIOSes
  * jump to 07C0:0000 instead of 0000:7C00.
  */
 ljmp $0, $ABS(real_start)            /*cs = 0*/
real_start: 
 /* set up %ds and %ss as offset from 0 */
 xorw %ax, %ax
 movw %ax, %ds
 movw %ax, %ss
 /* set up the REAL stack */
 movw $STAGE1_STACKSEG, %sp            /*STAGE1_STACKSEG = 0x2000*/          
 sti  /* we're safe again */
 /*
  *  Check if we have a forced disk reference here
  */
 MOV_MEM_TO_AL(ABS(boot_drive)) /* movb  ABS(boot_drive), %al */   
 cmpb $GRUB_INVALID_DRIVE, %al     /* 如果boot_drive=0xff,则表示从默认的位置加载stage2
                                       * 如果不是默认,把驱动器号保存在dl中
                                       */
 je 1f
 movb %al, %dl
1:
 /* save drive reference first thing! */
 pushw %dx                                    /*不是默认的话,保存才是有用的,否则没用*/
 /* print a notification message on the screen */
 MSG(notification_string)
 /* do not probe LBA if the drive is a floppy */
 testb $STAGE1_BIOS_HD_FLAG, %dl    /*如果是软盘,即STAGE1_STACKSEG=0,直接跳入chs模式*/
 jz chs_mode
   
 /* check if LBA is supported */
 movb $0x41, %ah          /*此时dl=80,ah=41h,bx=0x55aa,int 13h 检测第一块硬盘的CF位*/
 movw $0x55aa, %bx              /*即检查是否支持LBA寻址,不支持则CF=1*/
 int $0x13
       /**
        *AH 41h = function number for extensions check
      *DL drive index (e.g. 1st HDD = 80h)
      *BX 55AAh
        *CF Set On Not Present, Clear If Present
        ***/
 /*
  *  %dl may have been clobbered by INT 13, AH=41H.
  *  This happens, for example, with AST BIOS 1.04.
  */
 popw %dx
 pushw %dx
 /* use CHS if fails */
 jc chs_mode
 cmpw $0xaa55, %bx       /*测试后,正常情况下bx=0xaa55*/
 jne chs_mode
 /* check if AH=0x42 is supported if FORCE_LBA is zero */
 MOV_MEM_TO_AL(ABS(force_lba)) /* movb ABS(force_lba), %al */
 testb %al, %al
 jnz lba_mode
 andw $1, %cx                 /*CX Interface support bitmask:
                             * 1 - Device Access using the packet structure
                             * 2 - Drive Locking and Ejecting
                             * 4 - Enhanced Disk Drive Support (EDD)
                              */
 jz chs_mode
 
lba_mode:
 /* save the total number of sectors */
 movl 0x10(%si), %ecx            /*这是在干什么*/
 /* set %si to the disk address packet */
 movw $ABS(disk_address_packet), %si          /* si指向BIOS的参数*/
 /* set the mode to non-zero   mode =1*/
 movb $1, -1(%si)
 
 movl ABS(stage2_sector), %ebx
 /* the size and the reserved byte */
 movw $0x0010, (%si)                  /**/
 /* the blocks */
 movw $1, 2(%si)
 
 /* the absolute address (low 32 bits) */
 movl %ebx, 8(%si)
 /* the segment of buffer address */
 movw $STAGE1_BUFFERSEG, 6(%si)
 xorl %eax, %eax
 movw %ax, 4(%si)
 movl %eax, 12(%si)
 
/*
 * BIOS call "INT 0x13 Function 0x42" to read sectors from disk into memory
 * Call with %ah = 0x42
 *   %dl = drive number
 *   %ds:%si = segment:offset of disk address packet
 * Return:
 *   %al = 0x0 on success; err code on failure
 */
 movb $0x42, %ah
 int $0x13
 /* LBA read is not supported, so fallback to CHS.  */
 jc chs_mode
 movw $STAGE1_BUFFERSEG, %bx
 jmp copy_buffer
  
chs_mode: 
 /*
  *  Determine the hard disk geometry from the BIOS!
  *  We do this first, so that LS-120 IDE floppies work correctly.
  */
 movb $8, %ah
 int $0x13      /*INT 13h AH=08h: Read Drive Parameters AH Return Code
                          *DL number of hard disk drives
                          *DH logical last index of heads = number_of - 1 (because index starts with 0)
                          *CX logical last index of cylinders = number_of - 1 (because index starts with 0)
                            */
 jnc final_init    /* CF Set On Error, Clear If No Error */
     
 /*
  *  The call failed, so maybe use the floppy probe instead.
  */
 testb $STAGE1_BIOS_HD_FLAG, %dl
 jz floppy_probe
 /* Nope, we definitely have a hard disk, and we're screwed. */
 jmp hd_probe_error
final_init:
 
 movw $ABS(sectors), %si
 /* set the mode to zero */
 movb $0, -1(%si)

 /* save number of heads */
 xorl %eax, %eax
 movb %dh, %al
 incw %ax
 movl %eax, 4(%si)
 xorw %dx, %dx
 movb %cl, %dl
 shlw $2, %dx
 movb %ch, %al
 movb %dh, %ah
 /* save number of cylinders */
 incw %ax
 movw %ax, 8(%si)
 xorw %ax, %ax
 movb %dl, %al
 shrb $2, %al
 /* save number of sectors */
 movl %eax, (%si)
setup_sectors:
 /* load logical sector start (bottom half) */
 movl ABS(stage2_sector), %eax
 /* zero %edx */
 xorl %edx, %edx
 /* divide by number of sectors */
 divl (%si)
 /* save sector start */
 movb %dl, 10(%si)
 xorl %edx, %edx /* zero %edx */
 divl 4(%si)  /* divide by number of heads */
 
 /* save head start */
 movb %dl, 11(%si)
 /* save cylinder start */
 movw %ax, 12(%si)
 /* do we need too many cylinders? */
 cmpw 8(%si), %ax
 jge geometry_error
/*
 *  This is the loop for taking care of BIOS geometry translation (ugh!)
 */
 /* get high bits of cylinder */
 movb 13(%si), %dl
 shlb $6, %dl  /* shift left by 6 bits */
 movb 10(%si), %cl /* get sector */
 incb %cl  /* normalize sector (sectors go
     from 1-N, not 0-(N-1) ) */
 orb %dl, %cl /* composite together */
 movb 12(%si), %ch /* sector+hcyl in cl, cylinder in ch */
 /* restore %dx */
 popw %dx
 
 /* head number */
 movb 11(%si), %dh
/*
 * BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory
 * Call with %ah = 0x2
 *   %al = number of sectors
 *   %ch = cylinder
 *   %cl = sector (bits 6-7 are high bits of "cylinder")
 *   %dh = head
 *   %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
 *   %es:%bx = segment:offset of buffer
 * Return:
 *   %al = 0x0 on success; err code on failure
 */
 movw $STAGE1_BUFFERSEG, %bx
 movw %bx, %es /* load %es segment with disk buffer */
 xorw %bx, %bx /* %bx = 0, put it at 0 in the segment */
 movw $0x0201, %ax /* function 2 */
 int $0x13
 jc read_error
 movw %es, %bx
 
copy_buffer:
 movw ABS(stage2_segment), %es
 /*
  * We need to save %cx and %si because the startup code in
  * stage2 uses them without initializing them.
  */
 pusha
 pushw %ds
 
 movw $0x100, %cx
 movw %bx, %ds
 xorw %si, %si
 xorw %di, %di
 
 cld
 
 rep
 movsw
 popw %ds
 popa
 /* boot stage2 */
 jmp *(stage2_address)
/* END OF MAIN LOOP */
/*
 * BIOS Geometry translation error (past the end of the disk geometry!).
 */
geometry_error:
 MSG(geometry_error_string)
 jmp general_error
/*
 * Disk probe failure.
 */
hd_probe_error:
 MSG(hd_probe_error_string)
 jmp general_error
/*
 * Read error on the disk.
 */
read_error:
 MSG(read_error_string)
general_error:
 MSG(general_error_string)
/* go here when you need to stop the machine hard after an error condition */
stop: jmp stop
notification_string: .string "GRUB "
geometry_error_string: .string "Geom"
hd_probe_error_string: .string "Hard Disk"
read_error_string: .string "Read"
general_error_string: .string " Error"
/*
 * message: write the string pointed to by %si
 *
 *   WARNING: trashes %si, %ax, and %bx
 */
 /*
  * Use BIOS "int 10H Function 0Eh" to write character in teletype mode
  * %ah = 0xe %al = character
  * %bh = page %bl = foreground color (graphics modes)
  */
1:
 movw $0x0001, %bx
 movb $0xe, %ah
 int $0x10  /* display a byte */
message:
 lodsb
 cmpb $0, %al
 jne 1b /* if not end of string, jmp to display */
 ret
 /*
  *  Windows NT breaks compatibility by embedding a magic
  *  number here.
  */
 . = _start + STAGE1_WINDOWS_NT_MAGIC
nt_magic: 
 .long 0
 .word 0
 /*
  *  This is where an MBR would go if on a hard disk.  The code
  *  here isn't even referenced unless we're on a floppy.  Kinda
  *  sneaky, huh?
  */
part_start: 
 . = _start + STAGE1_PARTSTART
probe_values:
 .byte 36, 18, 15, 9, 0%3
GRUB源代码分析.pdf 立即下载

相关推荐

grub 0.97源代码

应用于linux平台下的单引导,多引导写分区表的程序

grub源码分析---1

grub源码分析

conansonic的博客 5703

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

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

Grub源码分析

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

DanXer的Linux专栏 6226

第8.1节 满足构网要求的功率器件与散热设计

摘要: 构网型变流器的功率器件选型与散热设计面临严苛要求,需综合考虑过载能力、暂态应力与可靠性。IGBT模块选型需重点评估电压/电流等级、损耗特性及结温波动,而SiC MOSFET虽具有高频低损耗优势,但面临栅极可靠性等挑战。散热设计需采用液冷等先进技术控制结温波动,并通过电热应力仿真和寿命预测实现可靠性优化。系统化选型流程需结合规范要求、工况谱分析和实测验证,为构网型变流器提供坚实的物理基础。

技术工作者 914

小红书分享链接失效?教你永久保存笔记的2种方法(含API调用技巧)

本文详细解析了小红书笔记链接失效的原因,并提供了两种永久保存笔记的方法,包括短链接转换API调用技巧和本地归档技术。通过Python代码示例和工具推荐,帮助用户实现笔记内容的高效保存和管理,确保珍贵内容不再丢失。

gin88的博客 2768

【GRUB】GRUB2代码初步解析

初步解析GRUB2代码。

jiangwei0512的博客 7257

多视图学习 (Multi-View Learning)

多视角/多视图学习(Multi-view learning)是陶大成提出的一个研究方向。我们都知道,在机器学习中样本可以用不同的特征(如图片可以用LBP、SIFT等特征)来表示,或者从不同的角度进行观察(如从前后左右观察一个对象),甚至是采用不同的传感器来观测(如RGB摄像头,Depth摄像头),这些不同的观测手段、角度或特征在多视角学习中称为“视角”。多视角学习通过对不同的视角进行统一分析和研究,希望能够得到更好的分类或聚类等等的效果。

CarpeDiem 3万+

GRUB 源代码分析:打开 LUKS 加密的boot磁盘分区的过程

本文深入探讨了GRUB如何处理LUKS加密的`boot`分区。安装GRUB时,`grub-install`会检查`boot`分区是否加密,并在`grub.cfg`中加入`cryptomount`命令。启动时,GRUB初始化加密模块,通过`cryptomount`命令解锁加密盘。接着,`search.fs_uuid`命令定位到加密的根文件系统,使GRUB能够读取并执行位于加密`boot`分区内的`grub.cfg`,继续引导过程。此外,GRUB实现了磁盘的透明加解密,确保了数据的安全性和系统的正常运行。

Linux内核研究者 1607

【CV论文精读】【协同感知综述】Collaborative Perception for Autonomous Driving :Current Status and Future Trend

感知是自动驾驶系统的关键模块之一,近年来取得了很大进展。然而,单个车辆的有限能力导致感知性能提高的瓶颈。为了突破个体感知的局限,协作感知被提出,它使车辆能够共享信息来感知视线和视野之外的环境。本文综述了有前途的协作感知技术的相关工作,包括介绍了基本概念,概括了协作模式,总结了协作感知的关键要素和应用。最后,我们讨论了这一研究领域面临的挑战和问题,并给出了一些潜在的进一步方向。

weixin_44184852的博客 4690

文石NoteX3国行版安装 Google Play经验分享

文石NoteX3国行版安装 Google Play经验分享。

2301_80693261的博客 7606

grub的编译安装

grub的编译安装比较容易。首先下载grub的源代码,然后解压,查看INSTALL文件,下面是INSTALL文件的一部分,是有关依赖的:The Requirements================GRUB depends on some software packages installed into your system. Ifyou don't have a...

weixin_34357436的博客 682

把时间当成数据:SAP ABAP 里的 DATS/TIMS 与 DATN/TIMN,怎么选才不踩坑

SAP项目中日期时间字段的陷阱与优化 日期时间字段(DATS/TIMS)在SAP项目中看似简单却常引发事故,主要问题包括: 非法日期(如20201331)入库后,在月结、对账时爆发异常 空值被处理为00000000导致排序错误 ABAP提供两种处理方案: 经典类型DATS/TIMS:存储为字符格式,校验宽松易存脏数据 HANA原生类型DATN/TIMN:数据库级校验,写入即拦截非法值 优化建议: 在接口层和入库前进行严格校验 新项目优先使用DATN/TIMN类型 对遗留数据使用DATS_IS_VALID等函

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

Linux GRUB启动分析之stage1

我最近学习Linux 基础,有时候看到一些新的东西,就会去找资料,关于喜欢刨根问底的同学,这个博主的文章是很好的,很棒的,真心的大牛,虚心去学习,原来学的东西都感觉记忆不深刻,一知半解,而这位博主的文章很好的让我理解, 还远远达不上透彻,前路慢慢,努力学习,莫问前程 闲言少叙。我们首先看下Linux的启动过程流程图: 这个流程图是大牛M. Tim Jones在Inside Linux...

一生只画眉 2667

【产品经理修炼之道】-如何搭建企业级账务系统?

笔者公司的业务模式具有一定的独特性,不同于我们常见的市面上供应链类公司的进销存模式。公司主要为各大银行和金融机构提供信贷领域的风控服务,客户主要通过请求公司的数据产品接口产生费用,可以简单地理解为请求一次接口收费0.5元,一个月若是有1w人请求同一个接口则公司需要收费5000元。

xiaoli8748的专栏 5406

基于Python的CT骨料图像分割与STL批量导出完整指南

本文介绍了一套完整的Python解决方案,用于CT骨料图像的分割与STL导出。针对CT图像中颗粒粘连、噪声伪影等技术难点,提出基于分水岭算法的分割策略,结合距离变换与标记控制实现颗粒分离。内容包括环境配置、数据读取与预处理、Otsu阈值分割、分水岭算法实现、表面提取与STL导出等关键步骤。教程提供详细代码及解释,帮助读者从CT体数据出发,最终生成每个颗粒的三维网格文件,便于后续定量分析和数值模拟。

huanghm88的专栏 237

GNU GRUB 2.00 源码分析笔记,持续更新

前言 很多运维类书籍或文章仅从系统管理者的角度讲解了GRUB的安装以及使用, 本篇博文则从GNUGRUB2.00 的源码入手,从开发者,以及系统底层运行机制的角度,分析GRUB是如何作为跨平台的“全面统一的引导加载程序”,来引导操作系统,加载 Linux 内核的过程等等, 部分内容参考了《深度探索 Linux 操作系统》一书中相关的内容(ISBN 978-7-11143901-1 )以及GNUGRUB项目官方站点的文档,并且加入自己分析源码时的笔记。 (由于个人 C 语言,汇...

zhaominyong的专栏 2959

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

grub的理解

1 前言 本文主要用来整理和描述在工作过程中使用grub遇到的问题和查阅的相关资料并做了个人总结,并未涉及到对grub的源码分析。 最近要将我很久之前为公司移植到一个新的硬件平台(Intel Bay Trail)上的系统进行备份,用来给生产人员在出厂硬件平台上将系统烧写进去。 由于硬件平台上的磁盘大小有32G,系统中用到的只有2G,所以没有进行全盘备份,只是使用dd指令分别备份MBR+GRUB和系...

艾玛 813

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

GRUB启动分析之stage1

引言 玩Linux的人,肯定会听说过Grub这个神奇的东西,就是开机启动时候下拉一个菜单让我们选操作系统的那个东东。自己比较懒,一直没深入琢磨这个Grub的工作原理流程。最近工作遇到了Grub相关的问题,就花了一些时间学习了一下Grub。 闲言少叙。我们首先看下Linux的启动过程流程图: 这个流程图是大牛M. Tim Jones在Inside Linux b

星仔的“韵” 3016

数学建模模型总结

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

GRUB引导程序之第一阶段stage1.S分析

初识BIOS BIOS是最基础的输入、输出系统,是固化在计算机主板上ROM芯片中的程序,可以这么理解,当计算机主板加电之后,CPU先加电,然后加载到CPU中运行的第一个计算机程序就是BIOS。 BIOS会执行POST(Power-on Self Test)硬件自检功能,自检完成之后,就会检索启动设备,并将启动设备的第一个柱面,第一个磁道的第一个扇区,共计512字节的内容读取到物理地址0x7c00处。 被读取的512字节就是MBR,在GRUB引导程序中,就是stage1,对应了一段汇编代...

快乐时光 3039

操作系统发行版特性学习

参考 整理一些大厂的开源平台及github,向他们看齐... 安装、引导、启动 BIOS/UEFI https://www.cnblogs.com/pengdonglin137/p/16618789.html 百敖BIOS培训系列一:UEFI启动流程总览 UEFI原理及开发视频教程 UEFI/Legacy bios简介与grub安装教程 Grub GRUB入门教程 GNU GRUB 项...

pengdonglin137的专栏 119
上一篇: linux内核中常用的汇编
下一篇: 用crosstool-ng建立arm-linux 4.3.2 交叉工具链
刘军卫
博客等级 码龄19年 1143粉丝 245原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值