2016-12-25 3 views
1

ПРИМЕЧАНИЕ. У меня еще нет пейджинга, и мое ядро ​​является мультизагрузкой, 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 к вызывающей функции, это приходит: The pointer seems to point nowhere

+1

Вам следует попробовать пройти через отладчик. _GDB_ было бы полезно. Вы могли видеть, что происходит, когда происходит прыжок. Одно из наблюдений заключается в том, что '_start: mov $ 0xDEADBEEF,% eax' может перемещаться по памяти после mov. Что произойдет, если вы перейдете в бесконечный цикл после чего-то вроде 'jmp .'? –

+0

Если вы создали минимальный полный проверенный пример, это поможет. Что-то завершено, что мы можем строить и тестировать. –

+0

@MichaelPetch Пожалуйста, взгляните на редактирование, BTW Я только понял, что указатель не указывает на какой-либо ярлык _start. Это кажется неприятностью. –

ответ

0

Здесь проблема

typedef void (*call_module_t)(void); 
call_module_t start_program = (call_module_t)mbd->mods_addr; 
start_program(); 

mbd->mods_addr - адрес таблицы структуры модулей, а не адрес модуля сам. Так что же такое решение?

unsigned int* modules = (unsigned int*)mbd->mods_addr; 
if (mbd->mods_count > 0) 
{ 
    unsigned int addr = modules[0]; 
    unsigned int size = modules[1]; 
    call_module_t start_program = (call_module_t)addr; 
    start_program(); 
} 
else 
    painc("module wasn't loaded"); 
Смежные вопросы