Assembly 在引导加载程序启动时读取堆栈是否安全? 背景
我正在尝试制作一个适用于两种体系结构的引导加载程序:x86和PDP-11。主操作系统是为兼容PDP-11的机器编写的,但是从x86启动也应该可以,启动模拟器 好的,如果最后两个字节是Assembly 在引导加载程序启动时读取堆栈是否安全? 背景,assembly,x86,x86-16,bootloader,stack-pointer,Assembly,X86,X86 16,Bootloader,Stack Pointer,我正在尝试制作一个适用于两种体系结构的引导加载程序:x86和PDP-11。主操作系统是为兼容PDP-11的机器编写的,但是从x86启动也应该可以,启动模拟器 好的,如果最后两个字节是0x55 0xaa,x86将第一个磁盘扇区加载到0x7c00,并跳到那里。相反,PDP-11兼容机器将第一个扇区加载到0o20000(八进制),如果第一个命令是NOP,最后两个字节是0xaa 0x55,则执行该扇区。但是,由于某些硬件细节,加载的数据实际上是反向的——例如,x86将读取0x12,而另一台机器将读取0x
0x55 0xaa
,x86将第一个磁盘扇区加载到0x7c00
,并跳到那里。相反,PDP-11兼容机器将第一个扇区加载到0o20000
(八进制),如果第一个命令是NOP
,最后两个字节是0xaa 0x55
,则执行该扇区。但是,由于某些硬件细节,加载的数据实际上是反向的——例如,x86将读取0x12
,而另一台机器将读取0xed
。这在某种程度上是本文中的一个特性,因为如果我将最后两个字节设置为0x55 0xaa
,它们将适用于两台机器
总之,PDP-11兼容机器要求前两个字节包含NOP
命令,即0o000240
或0x00a0
。数据是反向的,因此x86实际上将读取0xff5f
问题
0x5f
是x86中的实际命令。不幸的是,它是popdi
。AFAIK,sp
和ss
值都未指定,因此此命令读取谁知道是什么
我的问题是:
- 在实践中,我可以假设它们要么指向有效堆栈,要么都设置为某个占位符,例如
或0x0000:0x0000
0xffff:0xffff
- 是否可以
指向不安全读取的内存映射硬件寄存器?如果是的话,如果我阅读它们,会发生什么更糟糕的事情李>ss:sp
- 可能
指向不可用内存,即可能ss:sp
触发总线错误?如果是,BIOS将如何从中恢复,即它将重新启动、显示消息或执行其他操作pop di
[sp]
处的值后,实际上执行sp+=2
。如果初始堆栈位于引导扇区正下方,则SP将指向尚未执行的指令。或者它包装了SP。不过,我不认为错误。ss:SP=0x0000:0x7c00
案例是一个有效的观点,但我恐怕无法修复它——将cli
作为第二条指令,即使可能,也无法修复问题。还有其他用户更熟悉x86 BIOS引导,可以更好地解决问题。我不确定初始的SS:SP是否在0000:7c00
的正下方是常见的,但我想我看到有人说有时会这样做。表示堆栈可以位于RAM中的任何位置。请注意,PC引导扇区末尾的0x55 0xaa
字节仅在从硬盘(以及模拟为硬盘的东西)引导时才需要存在。从软盘启动时(以及模拟为软盘的东西)不需要它。