3

この日、気になるものを見つけました。シンプルなベア OS をビルドする

マルチブート対応にする方法を読みました。NASM と GCC を使用しています。マルチブート ヘッダーを持つローダーを作成し、そのためにシステムのメイン ポイントを呼び出す必要があります。loader.asm と loader.ld の 2 つのファイルがあります。

loader.asm
[BITS 32]
global start
start:
    mov esp, _sys_stack
    jmp stublet

ALIGN 4
mboot:
    MBOOT_PAGE_ALIGN        equ 1<<0
    MBOOT_MEMORY_INFO       equ 1<<1
    MBOOT_HEADER_MAGIC      equ 0x1BADB002
    MBOOT_HEADER_FLAGS      equ MBOOT_PAGE_ALIGN | MBOOT_MEMORY_INFO
    MBOOT_CHECKSUM          equ -(MBOOT_HEADER_MAGIC + MBOOT_HEADER_FLAGS)

    ; This is the GRUB Multiboot header. A boot signature
    dd MBOOT_HEADER_MAGIC
    dd MBOOT_HEADER_FLAGS
    dd MBOOT_CHECKSUM

stublet:
    EXTERN cmain
    call cmain
    jmp $
SECTION .bss
    resb 8192

_sys_stack:
loader.ld
ENTRY(start)
phys = 0x00100000;
SECTIONS
{
    .text phys : AT(phys) {
        code = .;
        *(.text)
        *(.rodata)
        . = ALIGN(4096);
    }
    .data : AT(phys + (data - code))
    {
        data = .;
        *(.data)
        . = ALIGN(4096);
    }
    .bss : AT(phys + (bss - code))
    {
        bss = .;
        *(.bss)
        . = ALIGN(4096);
    }
    end = .;
}
main.c
int GenyKernel_Main()
{
    char *str = "Hello world!", *ch;
    unsigned short *vidmem = (unsigned short*) VIDEO_MEMORY;
    unsigned i;

    for (ch = str, i = 0; *ch; ch++, i++) {
        vidmem[i] = (unsigned char) *ch | 0x0700;
    }

    return 0;
} 

私が使用しているビルドのために

# loader.o
nasm -f elf64 -o loader.o loader.asm
# main.o
gcc -fno-stack-protector -fno-builtin -nostdinc -O -g -Wall -I. -c -o main.o main.c 

そして最後のリンク

ld -T loader.ld -o kernel loader.o main.o

grub-mkrescue でシンプルな iso を構築し、qemu で実行しましたが、常に

ここに画像の説明を入力

問題はファイルにあると思いますloader.ldが、どこにあるのかわかりません

4

1 に答える 1

3

同じ .asm ファイルについてたくさん読んだ後、最終的に問題を理解しました。次のスニペット

align 4
multiboot_header:
    dd MBOOT_MAGIC
    dd MBOOT_FLAGS
    dd MBOOT_CHECKSUM

sectionリンカーに適切に含めるには、 a の下に存在する必要があります

section .text ; .multiboot o whatever
align 4
multiboot_header:
    dd MBOOT_MAGIC
    dd MBOOT_FLAGS
    dd MBOOT_CHECKSUM

そしてリンカースクリプトで

ENTRY(your_entry_point)
SECTIONS
{
  . = 0x00100000;
  .text ALIGN(0x1000) :
  {
    *(.multiboot)
    *(.text)
  }
  // rest of sections
}
于 2014-08-28T14:43:05.017 に答える