假设我在 C 上编写引导加载程序。当我创建一些全局变量时会发生什么?它的逻辑地址是什么?它与物理地址如何对应?例如,如果我创建了一些字符串(全局)
const char* s = "some string";
我对s
存储在.data
部分中是否正确?什么是物理地址,s
什么是逻辑地址?我们是否应该做一些额外的工作来使这些地址相互对应。
我的操作系统是 Linux,我像这样编译我的代码:
as --32 boot.S -o boot.o
gcc -c -m32 -g -Os -ffreestanding -Wall -Werror -I. -o mbr.o mbr.c
ld -Tlinker.ld -nostdlib -o mbr boot.o mbr.o
boot.S
就是我初始化一些寄存器并调用 c 代码的地方:
.code16
.text
.global _start
_start:
cli
xor %ax, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %ss
mov $0x7c00, %sp
ljmp $0, $mmain
mmain
-- C 代码中的函数。我的链接器脚本是:
OUTPUT_FORMAT(binary)
OUTPUT_ARCH(i8086)
ENTRY(_start)
SECTIONS
{
. = 0x7C00;
.text : { *(.text) }
.sig : AT(0x7DFE)
{
SHORT(0xaa55);
}
}