3

以下是教育实模式 x86 操作系统 MikeOs 的代码开头。(mikeos.sourceforge.net) 据我了解,x86 堆栈向低内存“向下”增长,堆栈段寄存器 ss 指向堆栈段中可能的最低内存位置(偏移量 0)。那么,问题来了,为什么要在代码段中添加 4096bytes 才能创建 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
4

3 回答 3

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)
于 2016-02-11T21:36:29.930 回答
1

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

于 2014-07-01T11:17:59.610 回答
0

你说的对。

没有理由在 ss 中添加 4096。512 就足够了(只是在代码之后移动)。也许作者为某些数据保留了这 4k 字节?

于 2014-07-01T11:24:19.867 回答