2013-07-09 21 views
4

我遇到了Grub 2(和QEMU的-kernel)未檢測到內核中的Multiboot v1標題的問題。在.text之前,我有一個單獨的部分的標題。Grub 2未檢測到內核中的多引導標題

linker.ld

SECTIONS 
{ 
    . = 1M; 

    .multiboot ALIGN(4K) : 
    { 
     *(.multiboot) 
    } 

    .text ALIGN(4K) : 
    { 
     *(.text) 
    } 

    [snip] 

boot.s(GNU爲語法):

.set MAGIC, 0x1badb002 
.set FLAGS, (1<<0 | 1<<1) # align, provide mem map 
.set CHECKSUM, -(MAGIC + FLAGS) 

.section .multiboot 
    .long MAGIC 
    .long FLAGS 
    .long CHECKSUM 

.section .text 
    [snip] 

我已驗證爲與幻數指定要添加的報頭部分:

kernel.bin:  file format elf32-i386 

Contents of section .multiboot: 
101000 02b0ad1b 03000000 fb4f52e4   .........OR.  
Contents of section .text: 
[snip] 

然而Grub 2說內核沒有一個有效的Multiboot他阿德爾,並使用QEMU的-kernel選項的原因:

qemu: fatal: Trying to execute code outside RAM or ROM at 0x000a000 

這似乎是在BIOS映射範圍內的地址,不要在那裏多引導應該是。

我已經比較了Bran和OSDev中的常用代碼(加上我以前的內核),但我似乎無法弄清楚我做錯了什麼。

+0

我已經exaclt了同樣的錯誤,什麼是錯的。我可以找到一個解決方案 – rkmax

回答

3

我遇到了與我的multiboot內核非常相同的錯誤。我得到了相同的錯誤,因爲.text部分的大小超過了大約4k。我的問題的原因是在連接時,我首先指定了kernel.o,然後在ld參數中指定了loader.o第二個參數(我寫了一個Makefile來製作我的項目,基於OSDev Wiki Bare Bones開發起來更加舒適)。多重引導應該在第一個4k中尋找頭文件,隨着我的代碼增長,它將頭部推出該區域(因爲它位於內核.text段中的加載器之前)。您爲多引導標題使用了單獨的部分,這可能是也可能不是一個好主意,我不知道。事情我想嘗試:

  • 刪除.multiboot部分,並把它的內容到加載器的開始,並確保該loader.o是第一個參數的鏈接,並kernel.o來後。
  • 使用readelf -a kernel確保多重引導頭確實是在第一4K(即,如果開始時間爲0x00100000,它的偏移量是低於0x00101000
+2

我有同樣的錯誤,你有一個樣本的github存儲庫? – rkmax

+0

@rkmax工作示例在:https://github.com/cirosantilli/x86-bare-metal-examples/tree/d217b180be4220a0b4a453f31275d38e697a99e0/多重/你好世界 –