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

Linux GRUB阶段1.5的代码驻留在磁盘上的什么位置?加载的地址是什么?,linux,boot,grub,Linux,Boot,Grub,我安装了GRUBV1.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 这段代码似乎试图设置stag

我安装了
GRUBV1.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
这段代码似乎试图设置stage 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的开始。除了第一条
jmp
指令外,该代码似乎尝试执行与windows 7 MBR中相同的操作,将原始MBR从
0x7c00
复制到
0x0600
。这些代码实际上会被执行吗?如果是,什么时候控制会跳到这里。(我相信答案是肯定的,但我被领先的
jmp
弄糊涂了。)

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

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


另请参阅:

grub安装首先尝试将core.img放在分区之间的可用空间中。如果没有足够的空间,您将看到一个错误。您可以仅使用开关强制grub在分区内写入core.img。您的回答有误导性。如果MBR和第一个分区之间没有足够的空间,grub-install会给出错误消息。抱歉,但grub 2仍然建议将
core.img
放在MBR间隙中(当然,除非磁盘是GPT):“使用此分区表格式[MBR],有两种安装GRUB的方法:它可以嵌入MBR和第一个分区之间的区域……GRUB开发团队通常建议在第一个分区之前嵌入GRUB,除非您有特殊要求。”。