2016-12-25 78 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(); 

現在我想編譯我的GAS文件到FL牛逼二元這些命令:

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但是當我去那裏,我得到異常:無效的操作碼。

這似乎是有用的,但不是:(

https://littleosbook.github.io/book.pdf#page=49&zoom=auto,-100,472

編輯 - 1所以,當我gdb'd調用函數,這出現: The pointer seems to point nowhere

+1

您應該嘗試使用調試器。 _GDB_會很有用。你可以看到跳轉發生時會發生什麼。一個觀察結果是,在mov之後,_start:mov $ 0xDEADBEEF,%eax'可能在內存中漫遊。如果你用'jmp .'之類的東西進入無限循環會發生什麼? –

+0

如果您創建了一個最小的完整可驗證示例,它將有所幫助。完成我們可以構建和測試的東西。 –

+0

@MichaelPetch請看看編輯,順便說一句,我剛剛意識到指針並沒有指向任何_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");