假设我正在编写自己的mbr
部分,并且想在哪里运行一些 C 代码。为此,我需要首先初始化堆栈,然后调用 C 代码。我以这样的方式做到了
boot.S
文件:
.code16
.section .bootstrap_stack #initializing stack here
stack_bottom:
.skip 16384
stack_top:
.text
.global _start
_start:
cli
movl $stack_top, %esp
call kmain
loop:
jmp loop
在我的 C 代码中,我有 function kmain
。
我的linker.ld
文件如下所示:
OUTPUT_FORMAT(binary)
OUTPUT_ARCH(i8086)
ENTRY(_start)
SECTIONS
{
. = 0x7C00;
.text : { *(.text) }
.sig : AT(0x7DFE)
{
SHORT(0xaa55);
}
}
所以问题是内存部分.bootstrap_stack
放在哪里?我没有告诉链接器脚本任何关于它的信息。但如果我这样做,那么输出文件的大小将超过 512 个字节,我不能将其用作mbr
. 为什么在这个 C 堆栈正常工作之后?