Dig*_*ggs 5 assembly callstack bios bootloader x86-16
假设我想将堆栈初始化为S
字节大小。
我想选择堆栈的基本位置,B
以便随着堆栈从 向下增长B
,我最终不会覆盖引导加载程序或 BIOS 使用的任何代码或其他内存。
由于我自己编写引导加载程序(并且初始 MBR 扇区被加载到线性地址0x7c00
),防止与引导加载程序发生冲突似乎是一个仔细规划的问题。
我如何知道 BIOS 代码所在的位置,以及我的堆栈是否可能覆盖 BIOS 正在使用的任何内存?
另外,是否可以保证初始ss:sp
值指向哪里,以及在不设置新值的情况下可以安全使用多少堆栈空间?
通常,引导加载程序会将 ss:sp 设置为 00000h:07c00h:。我进行了网络搜索,显然当 BIOS 跳转到引导加载程序时 ss:sp 设置为什么取决于 BIOS。对于 Microsoft MBR,引导加载程序将 ss:sp 设置为 00000h:07c00h,并将其大部分代码传输到 00000h:00600h,并跳转到 00000h:006xxh。依次查看分区表以查找可引导扇区并重复该过程、加载并跳转到 00000h:07c00h。这可能会重复一次。最终引导过程将加载多个扇区并开始 Microsoft 操作系统的实际引导。我不知道Linux类型操作系统的顺序。