GRUB stage 1.5的代码驻留在磁盘上的位置是什么?它加载的地址是什么?

时间:2012-07-06 07:39:10

标签: linux boot grub

我安装了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代码的磁盘地址,然后加载并运行它。但是,我怎么能弄清楚它试图读取哪个物理块?更重要的是,舞台1.5代码的目的地是什么? 0x7000

我指的是Windows 7的MBR,其中加载了后续启动代码0x7c00。鉴于MBR首先在地址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复制到0x0600,但第一个jmp指令除外。这些代码实际上会执行吗?如果是,那么什么时候会控制跳跃。(我相信答案是肯定的,但我会对领先的jmp感到困惑。)

1 个答案:

答案 0 :(得分:4)

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