GRUB是目前较流行启动引导程序。其第二版被主流Linux发行版所包括。本文将探索和分析GRUB的设计和实现机制。

boot.S是第一个研究对象,因为boot.S将被编译成boot.img(512字节),安装时安装在0号扇区,即主引导扇区(MBR)。

BIOS引导时会把主引导扇区装载到0x7c00开始的512字节内存区域,并设置CS:IP为0x0000:7c00。接着CPU会执行0x7c00处的指令,即boot.img(boot.S)中的第一条指令: jmp LOCAL(after_BPB) /* 机器码: eb 63 */ ,跳转到偏移量0x65的地方。

接下去的代码检查并设置正确的引导驱动器号码。

设置实模式堆栈指针为0x2000。

打印提示信息,如果没按SHIFT键并且不是SILENT引导的话。

调用BIOS中断INT 0x13, AH 0x41检测BIOS是否支持磁盘LBA模式。

如果支持LBA模式,通过BIOS中断INT 0x13, AH 0x42来装载1号扇区到地址0x70000(0x7000:0000)开始的内存区域。

如果不支持LBA模式,就使用CHS模式。通过BIOS中断INT 0x13, AH 0x02装载1号扇区到地址0x70000(0x7000:0000)开始的内存区域。这里会先调用BIOS中断INT 0x13, AH 0x13来获取磁盘参数。如果失败了并且启动盘是软盘的话,会进行软盘探测。有意思的是软盘探测的代码是放在偏移量0x1be开始的区域内的,也就是硬盘分区表在MBR中的相应位置。因为软盘是不使用硬盘分区表的,所以覆盖没有关系。而当boot.img被安装到硬盘上时,安装时这段代码将不会被复制,因为硬盘引导不需要进行软盘探测,失败就失败了。

接下来跳转到被命名为copy_buffer的一段代码来将前面装载到地址0x70000的1号扇区数据复制到内存地址0x8000开始的内存区域。

最后,在偏移量0x016f处执行指令 jmp *(kernel_address) /* 机器码: ff 26 5a 7c */ 会跳转到0x8000执行下一条指令。

至此boot.S中的代码执行完毕。

下一篇

GRUB2 分析 (一)的更多相关文章

  1. GRUB2 分析 (四)

    接上一篇 kernel.img由startup.S以及一堆c文件编译而成.这是一个ELF格式的文件.(其实前面的boot.img. diskboot.img.lzma_decompress.img本来 ...

  2. GRUB2 分析 (三)

    接上一篇 从地址0x8200开始的是lzma_decompress.img.这是由startup_raw.S编译生成的.这个文件稍微复杂点.首先一开始就是个跳转指令: ljmp $0, $ABS(LO ...

  3. GRUB2 分析 (二)

    接上一篇 实际上在512字节的MBR中,真正可用的空间并不多.除了一开始的跳转指令外,起始部分是一个被称为BPB的区域,即BIOS参数块(BISO Parameter Block).主要是FAT和NT ...

  4. Linux学习-Boot Loader: Grub2

    boot loader 的两个 stage 在 BIOS 读完信息后,接下来就是会到第一个开机装置 的 MBR 去读取 boot loader 了.这个 boot loader 可以具有选单功能.直接 ...

  5. Linux学习-Linux 的开机流程分析

    开机流程一览 系统开机的经过可以汇整成底下的流程的: 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置; 读取并执行第一个开机装置内 MBR 的 boot Loader (亦 ...

  6. alias导致virtualenv异常的分析和解法

    title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...

  7. 火焰图分析openresty性能瓶颈

    注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...

  8. 一起来玩echarts系列(一)------箱线图的分析与绘制

    一.箱线图 Box-plot 箱线图一般被用作显示数据分散情况.具体是计算一组数据的中位数.25%分位数.75%分位数.上边界.下边界,来将数据从大到小排列,直观展示数据整体的分布情况. 大部分正常数 ...

  9. 应用工具 .NET Portability Analyzer 分析迁移dotnet core

    大多数开发人员更喜欢一次性编写好业务逻辑代码,以后再重用这些代码.与构建不同的应用以面向多个平台相比,这种方法更加容易.如果您创建与 .NET Core 兼容的.NET 标准库,那么现在比以往任何时候 ...

随机推荐

  1. Android 蓝牙学习

    Android 蓝牙学习 学习缘由 上个礼拜公司要开发个简单的五子棋游戏!其中一个需求就是支持蓝牙对战!所以苦逼的我学习蓝牙方面的知识了! 简介 Bluetooth是目前使用最广泛的无线通讯协议,近距 ...

  2. 【BZOJ4318】OSU! 期望DP

    [BZOJ4318]OSU! Description osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1 ...

  3. 记一个在docker中运行多线程event_loop.run_forever()的bug

    问题简介 我写爬虫,用到了asyncio相关的事件循环,新建了一个线程去run_forever(),在docker中运行.后来程序有异常,主线程挂了,但是竟然不报错.查了很久,才找出来. 如果你新建一 ...

  4. 170404、java版ftp操作工具类

    package com.rick.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotF ...

  5. Jquery 中 .trigger 的用法

    项目中有个需求,数据加载完成后,默认模拟点击某个元素节点(选中某个元素节点)并触发事件 $('.course_list dd').on('click', function () {     //取当前 ...

  6. Exchange Pause or stop transport service

    The Microsoft Exchange Transport service is a service available both on the Microsoft Exchange Serve ...

  7. 刚开始学Python,坚持下去

    嗯,刚开始学Python没几天,挺好的一门语言,十分简洁,也很好上手. 坚持下去,每天至少看一个小时的Python.

  8. IIs7下配置php

    因为一个朋友的服务器是window的需要两个版本的php,一个是现在用的php5.2,现在要用一个5.3的版本,所以考虑IIS下的配置. 1.首先当然是要下载一份php了,我采用的是免安装的,很方便, ...

  9. 解决mysql不能通过'/tmp/mysql.sock 连接的问题

    解决方法:php标准配置正是通过'/tmp/mysql.sock',但一些mysql安装方法将mysql.sock放在/var/lib/mysql.sock或者其他地方,你可以通过修改/etc/my. ...

  10. SoftReference、WeakReference、PhantomRefrence分析和比较

    级别 什么时候被垃圾回收 用途 生存时间 强引用 从来不会 对象的一般状态 JVM停止运行时终止 软引用 在内存不足时 优化内存使用 内存不足时终止 弱引用 在垃圾回收时 对象缓存 gc运行后终止 虚 ...