GRUB 阶段 1.5 的代码驻留在磁盘的啥位置,加载的地址是啥?
Posted
技术标签:
【中文标题】GRUB 阶段 1.5 的代码驻留在磁盘的啥位置,加载的地址是啥?【英文标题】:Where does code of GRUB stage 1.5 reside on disk and what is the address it is loaded?GRUB 阶段 1.5 的代码驻留在磁盘的什么位置,加载的地址是什么? 【发布时间】:2012-07-06 15:45:35 【问题描述】:我安装了grub v1.98
,在反汇编 MBR 后,我发现以下代码 sn-p 我不明白:
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 首先加载到地址 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
弄糊涂了)。
【问题讨论】:
【参考方案1】: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
【讨论】:
grub-install 首先尝试将 core.img 放在分区之间的空闲空间中。如果那里没有足够的空间,您会看到一个错误。您可以强制 grub 仅使用开关在分区内写入 core.img。您的回答具有误导性。 如果 MBR 和第一个分区之间没有足够的空间,grub-install 会给出错误消息。 对不起,但是 Grub 2 仍然建议将core.img
放在 MBR 间隙中(除非磁盘当然是 GPT):“使用这种分区表格式 [MBR],安装 GRUB 有两种方法:可以嵌入在MBR和第一个分区之间的区域……GRUB开发团队一般建议在第一个分区之前嵌入GRUB,除非你有特殊要求。” Grub 2.02.以上是关于GRUB 阶段 1.5 的代码驻留在磁盘的啥位置,加载的地址是啥?的主要内容,如果未能解决你的问题,请参考以下文章
API 调用驻留在存储库模式 laravel 应用程序中的啥位置?