6

我已经grub v1.98安装并在反汇编 MBR 后发现以下我不理解的代码片段:

xor ax,ax
mov [si+0x4],ax
inc ax
mov [si-0x1],al
mov [si+0x2],ax
mov word [si],0x10
mov ebx,[0x7c5c]
mov [si+0x8],ebx
mov ebx,[0x7c60]
mov [si+0xc],ebx
mov word [si+0x6],0x7000
mov ah,0x42
int 0x13

这段代码似乎试图设置 1.5 阶段代码的磁盘地址,然后加载并运行它。但是,我怎样才能确定它试图读取哪个物理块?更何况,stage 1.5 代码的目的地是什么?0x7000?

我指的是 Windows 7 的 MBR,其中加载了后续启动代码0x7c00。给定 MBR 首先在 address 加载0x7c00,它包含一段将 MBR 复制0x7c00到的代码0x0600,然后分支到0x0600,以防原始代码损坏。加载阶段 1.5 的代码会0x7000与原始代码冲突吗?更重要的是,我还发现:

jmp short 0x65
nop
sar byte [si+0x7c00],1
mov es,ax
mov ds,ax
mov si,0x7c00
mov di,0x600
mov cx,0x200
cld
rep movsb
push ax
push word 0x61c
retf

在 MBR 的开头。除了第一条指令外,代码似乎试图做与 Windows 7 的 MBR 相同的事情,将原始 MBR 从复制0x7c00到。这些代码实际上会执行吗?如果是,什么时候控制跳转到这里。(我相信答案是肯定的,但被领先者弄糊涂了)。0x0600jmpjmp

4

1 回答 1

5

GRUB 1.98 是 GRUB 版本 2。在版本 2 中,不再有阶段 1.5。阶段 1.5 在 MBR 和第一个分区之间有一个固定的位置。它(通常)是硬盘驱动器上未使用的空间。GPT 分区和其他(不寻常的)布局不提供此空间。

在 GRUB v2 阶段 1 中加载 core.img,它可以存储在任何 LBA48 位置,通常在 MBR 和第一个分区之间,但也可以存储在分区内。在 GPT 的非 EFI 情况下,应为其创建自定义分区。该位置被硬连线到第 1 阶段。

另见:http ://www.gnu.org/software/grub/manual/grub.html#Images

于 2012-07-29T00:54:23.417 回答