0

C でブートローダーを作成するとします。グローバル変数を作成するとどうなりますか? その論理アドレスは何ですか?物理アドレスにどのように対応していますか? たとえば、文字列(グローバル)を作成した場合

const char* s = "some string";

セクションにs保存されているのは正しいですか?.data物理アドレスとs論理アドレスは何でしょうか? このアドレスを互いに対応させるために、追加の作業を行う必要があります。

私の OS は 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);
    }
}
4

0 に答える 0