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);
}
}