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

时间:2015-12-08 18:52:04

标签: c linux real-mode

假设我在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);
    }
}

0 个答案:

没有答案