Ошибка GRUB 13: недопустимый или неподдерживаемый исполняемый формат в пользовательском ядре

#operating-system #nasm #osdev #grub #bochs

#операционная система #nasm #osdev #grub #bochs

Вопрос:

Я пытаюсь изучить OS Dev, и я начал создавать свое собственное ядро на основе Небольшой книги о разработке ОС.

Когда я загрузил ядро с помощью bochs, GRUB жалуется:

 error 13: invalid or unsupported executable format
  

Файлы, которые я использую:

loader.s

 global loader

MAGIC_NUMBER equ 0xBADB002
FLAGS equ 0x0
CHECKSUM equ -MAGIC_NUMBER

section .text
align 4
    dd MAGIC_NUMBER
    dd FLAGS
    dd CHECKSUM

loader:
    mov eax, 0xCAFEBABE
.loop:
    jmp .loop
  

link.ld

 ENTRY(loader)

SECTIONS
{
    . = 0x00100000;

    .text ALIGN (0x1000) :
    {
        *(.text)
    }

    .rodata ALIGN (0x1000) :
    {
        *(.rodata*)
    }

    .data ALIGN (0x1000) :
    {
        *(.data)
    }

    .bss ALIGN (0x1000) :
    {
        *(COMMON)
        *(.bss)
    }
}
  

bochsrc.txt

 megs:              32
display_library:    sdl
romimage:           file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage:        file=/usr/share/bochs/VGABIOS-lgpl-latest
ata0-master:        type=cdrom, path=os.iso, status=inserted
boot:               cdrom
log:                bochslog.txt
clock:              sync=realtime, time0=local
cpu:                count=1, ips=1000000
  

menu.lst

 default=0
timeout=0

title First OS
kernel /boot/kernel.elf
  

команды для выполнения:

 nasm -f elf32 loader.s
ld -T link.ld -melf_i386 loader.o -o kernel.elf
genisoimage -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -A os -input-charset utf8 -quiet -boot-info-table -o os.iso iso
bochs -f bochsrc.txt
  

Моя структура файлов выглядит следующим образом:

 os_dev
  |--(rest of the files)
  |--iso
    |-- boot
      |-- kernel.elf
      |-- grub
        |-- menu.lst
        |-- stage2_eltorito
  

Файл stage2_eltorito был загружен с https://github.com/littleosbook/littleosbook/blob/master/files/stage2_eltorito

Комментарии:

1. Я только что понял. Если вы используете mulitboot, не должна ли строка в menu.lst быть multiboot /boot/kernel.elf

2. Просто попробовал вашу рекомендацию. Похоже, что это усугубляет ситуацию, поскольку grub теперь не понимает файл menu.lst и выдает мне терминал grub, чтобы выяснить это вручную.

3. Попробовал это: menuentry "First OS"n {n multiboot /boot/kernel.elfn bootn } происходит то же самое…

4. Я сделал это, как вы сказали, я просто не знаю, как сделать перевод строки в стиле кода комментариев

5. Хорошо, вернитесь к тому, что у вас было изначально. Одна проблема, которую я только что заметил, — это опечатка. Не MAGIC_NUMBER equ 0xBADB002 должно быть MAGIC_NUMBER equ 0x1BADB002 ?

Ответ №1:

Майкл Петч заметил, что Б. Костас использовал неправильное магическое число для устаревшего Grub.

Изменение MAGIC_NUMBER equ 0xBADB002 в loader.s на MAGIC_NUMBER equ 0x1BADB002 решило проблему.