ПРИМЕЧАНИЕ. У меня еще нет пейджинга, и мое ядро является мультизагрузкой, ELF. У меня есть irqs и isrs.Невозможно загрузить плоский двоичный файл в ядро
Так что этот газ файл здесь:
.section .text
.global _start
_start:
mov $0xDEADBEEF, %eax
И Grub2 установка для загрузки плоского двоичного файла:
menuentry "fOS-Terminal (25x80)" {
multiboot /boot/fos.elf
module /modules/program.bin
set gfxmode=80x25
}
А вот в моем kernel.c, я могу разобрать мультизагрузочную заголовок чтобы получить адрес модуля, и я зову его:
typedef void (*call_module_t)(void);
call_module_t start_program = (call_module_t)mbd->mods_addr;
start_program();
Сейчас я пытаюсь скомпилировать мой файл газа в FLA т двоичный с этими командами:
i686-elf-as --32 ./iso/modules/program.s -o ./iso/modules/program.o
i686-elf-ld -fPIC -shared --oformat binary ./iso/modules/program.o -o ./iso/modules/program.bin
ПРОБЛЕМА - GRUB2, безусловно, загрузить ядро, заголовок мультизагрузочным говорит мне, что по адресу - 0x100ac, но когда я иду туда, я получаю исключение: INVALID OpCode.
Это кажется полезным, но не :(
https://littleosbook.github.io/book.pdf#page=49&zoom=auto,-100,472
EDIT - 1 Итак, когда я gdb'd к вызывающей функции, это приходит:
Вам следует попробовать пройти через отладчик. _GDB_ было бы полезно. Вы могли видеть, что происходит, когда происходит прыжок. Одно из наблюдений заключается в том, что '_start: mov $ 0xDEADBEEF,% eax' может перемещаться по памяти после mov. Что произойдет, если вы перейдете в бесконечный цикл после чего-то вроде 'jmp .'? –
Если вы создали минимальный полный проверенный пример, это поможет. Что-то завершено, что мы можем строить и тестировать. –
@MichaelPetch Пожалуйста, взгляните на редактирование, BTW Я только понял, что указатель не указывает на какой-либо ярлык _start. Это кажется неприятностью. –