linux - GRUB 的第 1 阶段引导加载程序如何加载第 2 阶段引导加载程序?

标签 linux bootloader grub

从过去的一周开始,我对一个问题感到困惑,即只有 446 字节的 grub 第一阶段引导加载程序如何能够搜索第二阶段,而第二阶段是在一个复杂的文件系统中!它是如何定位第二阶段的?

当有windows和linux的复杂分区方案,而linux系统完全在扩展分区中,那么stage 1如何找到stage 2呢?甚至是 1.5 阶段?

所有 grub 教程都会略过这个重要部分。我在互联网上进行了搜索,但找不到任何可以解释这一点的内容。遗憾的是,我不是汇编程序员。

我想根据启动过程中硬盘的哪些扇区被触发(以及大致如何触发)来详细了解启动过程。 *请给我指出一个好的资源或在这里回答。这将极大地帮助我明智地使用 grub。*

搜索的一些资源:

  1. Linux 的工作原理:每个 super 用户都应该知道的,作者:Brian Ward
  2. http://www.dedoimedo.com/computers/grub.html
  3. 过去的一些 stackoverflow 问题。

最佳答案

第 1 阶段“知道”第 2 阶段的位置是通过嵌入其中的 block 列表加载表中的条目。它从引导驱动器加载 block 列表,然后以 16 位实模式跳转到指定的 CS:IP。这些在嵌入式数据页面中进行了描述。它查询 BIOS 的磁盘几何结构,并将那里的线性 block 编号映射到 INT 13h BIOS 接口(interface)使用的 C:H:S 地址。

http://www.uruk.org/orig-grub/technical.html

还有很多时间需要新的磁盘对齐,MBR 和第一个分区之间只有不到 1-2 MB 的未分配空间,而第 2 阶段有时会卡在那里。

关于linux - GRUB 的第 1 阶段引导加载程序如何加载第 2 阶段引导加载程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16482496/

相关文章:

linux - 如何使用 grub2-extra-lua 模块

linux - 如何将变量作为键传递给perl中的散列

arm - 使用 gcc 的 Intel 十六进制格式和位置独立代码

assembly - 汇编代码说明

linux - 在哪里可以找到有关可以通过内核启动命令行传递的所有参数的文档?

ubuntu - 如何制作 "Hello world"内核

c - 在 Grub 2.02 源代码中查找倒数计时器

c - ENXIO 对于 i2c ioctl 意味着什么?

socket() 能否因 EINPROGRESS 而失败

c - 故障 (SIGSEGV) 信号处理程序期间的 backtrace() 函数