#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
решило проблему.