4

背景

我正在尝试制作一个适用于两种架构的引导加载程序: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,两者spss值都没有指定,所以这个命令读取谁知道什么。

我的问题是:

  • 在实践中,我可以假设它们要么指向有效堆栈,要么都设置为某个占位符,例如0x0000:0x00000xffff:0xffff
  • 可能ss:sp指向不安全读取的内存映射硬件寄存器?如果是的话,如果我阅读它们会发生什么更糟糕的事情?我不想意外杀死笔记本电脑。
  • 可能ss:sp指向不可用的内存,即可能pop di触发总线错误?如果是,BIOS 将如何从中恢复,即它会重新启动、显示消息或执行其他操作吗?
4

0 回答 0