应如何在 x86 实模式引导加载程序中将堆栈初始化以防止与 BIOS 发生冲突?

How should the stack be initialized to in an x86 real mode bootloader to prevent conflicts with BIOS?

假设我想将堆栈初始化为 S 字节的大小。

我想选择堆栈的基本位置 B 以便随着堆栈从 B 向下增长,我最终不会覆盖任何代码或其他正在使用的内存引导加载程序或 BIOS。

由于我自己编写引导加载程序(并且初始 MBR 扇区被加载到线性地址 0x7c00),因此防止与引导加载程序发生冲突似乎是一个仔细计划的问题。

我如何知道 BIOS 代码的位置,以及我的堆栈是否会覆盖 BIOS 正在使用的任何内存?

此外,是否可以保证初始 ss:sp 指向的位置,以及在不设置新值的情况下我可以安全使用多少堆栈 space?

通常,引导加载程序会将 ss:sp 设置为 00000h:07c00h:。我进行了网络搜索,显然当 BIOS 跳转到引导加载程序时 ss:sp 设置为什么取决于 BIOS。在 Microsoft MBR 的情况下,引导加载程序将 ss:sp 设置为 00000h:07c00h,并将其大部分代码转移到 00000h:00600h,并跳转到 00000h:006xxh。依次查看分区 table 以找到 bootable 扇区并重复该过程,加载并跳转到 00000h:07c00h。这可能会重复一次。最终,引导过程将加载多个扇区并启动 Microsoft 操作系统的实际引导。我不知道 Linux 类型操作系统的顺序。