为啥 MBR 将自身复制到“0x0600”?

Posted

技术标签:

【中文标题】为啥 MBR 将自身复制到“0x0600”?【英文标题】:Why MBR copies itself to "0x0600"?为什么 MBR 将自身复制到“0x0600”? 【发布时间】:2021-12-22 23:19:34 【问题描述】:

我曾尝试研究 X86 MBR 代码如下:

0000:7C00 FA            CLI                     
0000:7C01 33C0          XOR     AX,AX           
0000:7C03 8ED0          MOV     SS,AX
0000:7C05 BC007C        MOV     SP,7C00         
0000:7C08 8BF4          MOV     SI,SP           
0000:7C0A 50            PUSH    AX
0000:7C0B 07            POP     ES              
0000:7C0C 50            PUSH    AX
0000:7C0D 1F            POP     DS              
0000:7C0E FB            STI                     
0000:7C0F FC            CLD                     
0000:7C10 BF0006        MOV     DI,0600         

代码最后一行的原因我看不懂。

【问题讨论】:

【参考方案1】:

因为 boot0 被 Bios 加载到地址 0x7C00,它会将自身复制到地址 0x600,然后将控制权转移到那里。

有关更多信息,请参阅this manual,它包含您需要的所有详细信息。实际上,这是因为引导段加载在一个固定地址,因此如果您需要从先前链接的引导段中调用某些内容,则必须将其存储在其他位置。

选择的地址是一个“合理”的地址,可以最大限度地减少当前内存的碎片并允许您拥有一个堆栈:此阶段可用的低内存范围从 0x500 到 0x7ff 并且您必须拾取低于标准的位置入口点位于 0x7c0。随着堆栈向下增长,选择 0x600 作为重定位地址将为堆栈提供 0x100 字节,并允许您将其余内存用于其他目的。详情请见here。

【讨论】:

感谢您的解释,但我不明白为什么 MBR 将自身复制到“0x0600”。在您分享的上述链接中,解释启动过程中的步骤,但找不到复制到 0X0600 的原因。 嗨,我已经改进了答案。现在有用吗? 是的,这很有帮助。非常感谢。

以上是关于为啥 MBR 将自身复制到“0x0600”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥复制构造函数不需要检查输入对象是不是指向自身?

为啥 [1,2,3] 在 Javascript 中不等于自身? [复制]

如果您将字典深入复制到自身会发生什么?

我们如何生成一定数量的随机数并将它们相互链接,而无需将数字链接到自身? [复制]

Vue如何将数组复制到本地进行编辑?为啥它适用于字符串而不适用于数组? [复制]

无法将文件从包复制到 Documents 目录,为啥 fileExistsAtPath 返回错误?