实模式下C代码中的逻辑和物理地址

实模式下C代码中的逻辑和物理地址,c,linux,real-mode,C,Linux,Real Mode,假设我在C上编写引导加载程序。当我创建一些全局变量时会发生什么?它的逻辑地址是什么?它如何对应于物理地址?例如,如果我创建了一些字符串(全局) 存储在.data部分的s对吗?s的物理地址是什么,逻辑地址是什么?我们是否应该做一些额外的工作,使这些地址相互对应 我的操作系统是Linux,我编译代码如下: as --32 boot.S -o boot.o gcc -c -m32 -g -Os -ffreestanding -Wall -Werror -I. -o mbr.o mbr.c ld

假设我在C上编写引导加载程序。当我创建一些全局变量时会发生什么?它的逻辑地址是什么?它如何对应于物理地址?例如,如果我创建了一些字符串(全局)

存储在
.data
部分的
s
对吗?
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);
    }
}

这个问题是不可回答的,除非你发布了你正在使用的编译器。实模式编译依赖于编译器和所使用的操作系统。如果你想在没有操作系统的情况下为纯实数模式编译,那么问题就完全取决于编译器了——如果编译器支持为原始实数模式编译。链接器应该有一个选项,可以向你显示一个内存映射,说明它把所有东西放在哪里。如果它不去你想要的地方,可能有一个选项可以改变它。逻辑地址和物理地址是一个受保护的模式。“不确定您在真实模式中指的是什么。@DanielKamilKozar更新了我的question@chux更新了我的问题
OUTPUT_FORMAT(binary)
OUTPUT_ARCH(i8086)
ENTRY(_start)

SECTIONS
{
    . = 0x7C00;
    .text : { *(.text) }
    .sig : AT(0x7DFE)
    {
        SHORT(0xaa55);
    }
}