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
您應該嘗試使用調試器。 _GDB_會很有用。你可以看到跳轉發生時會發生什麼。一個觀察結果是,在mov之後,_start:mov $ 0xDEADBEEF,%eax'可能在內存中漫遊。如果你用'jmp .'之類的東西進入無限循環會發生什麼? –
如果您創建了一個最小的完整可驗證示例,它將有所幫助。完成我們可以構建和測試的東西。 –
@MichaelPetch請看看編輯,順便說一句,我剛剛意識到指針並沒有指向任何_start標籤。這似乎麻煩。 –