2013-07-09 11 views
4

У меня проблема с Grub 2 (и -kernel), не обнаруживающая заголовок Multiboot v1 в моем ядре. У меня есть заголовок в отдельном разделе до .text.Grub 2 не обнаруживает заголовок Multiboot в ядре

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. Адер, и используя -kernel вариант из QEMU причиняет:

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

, который, как представляется, адрес в диапазоне BIOS-карту, не там, где Мультизагрузочный должно быть.

Я сравнивал с обычным кодом в Bran's и OSDev (плюс предыдущее ядро), но я не могу понять, что я делаю неправильно.

+0

Я exaclt ту же ошибку, что неправильно. я могу найти решение – rkmax

ответ

3

Я столкнулся с той же ошибкой с моим многозадачным ядром. Я получил ту же ошибку, что и размер раздела .text превысил около 4k. Причиной моей проблемы было то, что при связывании я сначала указал kernel.o и loader.o второй в аргументах ld (я написал Makefile, чтобы сделать мой проект на основе OSDev Wiki Bare Bones более удобным для разработки). Предполагается, что Multiboot ищет заголовок в первых 4k, и по мере того, как мой код рос, он вытолкнул заголовок из этой области (поскольку он был расположен перед загрузчиком в разделе .text) ядра. Вы использовали отдельный раздел для заголовка multiboot, который может быть или не быть хорошей идеей, я не знаю. Вещи, которые я хотел бы попробовать:

  • удалить раздел .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/ мультизагрузочным/привет-мир –