ошибка: заголовок мультизагрузки не найден

В этот день нашел то, что привлекло мое внимание. построить простую голую ОС

я прочитал, как сделать мультизагрузку совместимой, я использую NASM и GCC, мне нужно сделать загрузчик с заголовком мультизагрузки и вызвать основную точку моей системы, для этого у меня есть два файла loader.asm и loader.ld

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

Я создал простой iso с grub-mkrescue и запускал с qemu, но всегда получаю

введите здесь описание изображения

Думаю проблема в файле loader.ld но не могу найти где


person rkmax    schedule 27.08.2014    source источник
comment
Связано: stackoverflow. ком/вопросы/17539464/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 03.09.2015
comment
Минимальный рабочий пример: github.com/cirosantilli/ x86-голые-металлические-примеры/дерево/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 15.09.2015


Ответы (1)


Прочитав много об одном и том же файле .asm, я наконец понял проблему, следующий фрагмент

align 4
multiboot_header:
    dd MBOOT_MAGIC
    dd MBOOT_FLAGS
    dd MBOOT_CHECKSUM

должен существовать ниже section для надлежащего включения в компоновщик

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
}
person rkmax    schedule 28.08.2014