Bootloader堆栈配置

时间:2014-07-01 10:39:30

标签: assembly x86 stack bootloader real-mode

以下是教育实际代码的开头 模式x86操作系统MikeOs。 (mikeos.sourceforge.net)据我所知 x86堆栈向下“向下”,即低内存和堆栈段 寄存器ss指向堆栈段中的最低可能存储器位置(偏移0)。 所以,问题是,为什么有必要在代码段中添加4096字节 为了创建4K堆栈?是否应该添加512个字节是不够的 代码段并存储在ss堆栈段中,因为引导扇区 可能只有512字节长?

 BITS 16

 start:
  mov ax, 07C0h   ; Set up 4K stack space after this bootloader
  add ax, 288     ; (4096 + 512) / 16 bytes per paragraph
  mov ss, ax
  mov sp, 4096
  mov ax, 07C0h   ; Set data segment to where we're loaded
  mov ds, ax

3 个答案:

答案 0 :(得分:2)

以下是内存映射,以便于分析:

-------------- <— 07C0:0 boot loader memory starts
|            |
| 512 bytes  |  For the boot loader code
--------------
|            |  It could be use for whatever purpose the author has planned
|            |  for this memory area.
| 4096 + 512 |  (Maybe for the OS? Or stage2 loader? Who knows, it doesn't matter.)
|            |
-------------- <- 19C0:0 - Stack Segment(SS):Stack Pointer(SP) - Max of the stack
|            |        /\
| 4KB stack  |        || Stack grows
--------------    19C0:1000                               - Start of the stack(bottom)

答案 1 :(得分:1)

堆栈的大小与使用堆栈的代码大小无关。示例:一个递归的代码片段可以是几十个字节长,但使用兆字节的堆栈 - 虽然引导加载程序中的递归不太可能。但是有中断和ROM中的固件,它们可能会因某些中断而获得控制 - 不需要大量堆栈,但它增加了引导程序已经声明的内容。一般来说,我说512字节的堆栈就足够了,但是比抱歉更安全,特别是如果提供更多堆栈空间的成本是零。

答案 2 :(得分:0)

你是对的。

没有理由将4096添加到ss。需要512(仅在代码后移动)。也许作者会为一些数据保留这些4k字节?