背景
我正在尝试制作一个适用于两种架构的引导加载程序:x86 和 PDP-11。主操作系统是为兼容 PDP-11 的机器编写的,但是从 x86 引导也应该可以工作,启动一个模拟器。
AFAIK,x86 将第一个磁盘扇区加载到0x7c00
并跳转到那里,如果最后两个字节是0x55 0xaa
. 相反,PDP-11 兼容机器将第一个扇区加载到0o20000
(八进制)并在第一个命令是NOP
并且最后两个字节是时执行它0xaa 0x55
。但是,由于某些硬件细节,加载的数据实际上是反转的——例如,x86 会读取0x12
的地方,另一台机器会读取0xed
. 在这种情况下,这在某种程度上是一个功能,因为如果我制作最后两个字节0x55 0xaa
,它们将适用于两台机器。
总之,PDP-11 兼容机器需要前两个字节来包含NOP
命令,即0o000240
,或0x00a0
。数据是反转的,所以 x86 实际上会读取0xff5f
。
问题
0x5f
是 x86 中的真实命令。不幸的是,它是pop di
。AFAIK,两者sp
和ss
值都没有指定,所以这个命令读取谁知道什么。
我的问题是:
- 在实践中,我可以假设它们要么指向有效堆栈,要么都设置为某个占位符,例如
0x0000:0x0000
或0xffff:0xffff
? - 可能
ss:sp
指向不安全读取的内存映射硬件寄存器?如果是的话,如果我阅读它们会发生什么更糟糕的事情?我不想意外杀死笔记本电脑。 - 可能
ss:sp
指向不可用的内存,即可能pop di
触发总线错误?如果是,BIOS 将如何从中恢复,即它会重新启动、显示消息或执行其他操作吗?