首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Grub 2没有检测到内核中的多重引导头

Grub 2没有检测到内核中的多重引导头
EN

Stack Overflow用户
提问于 2013-07-09 03:34:48
回答 1查看 4K关注 0票数 5

我对Grub 2(以及QEMU的-kernel)有问题,无法在内核中检测到多重引导v1头。在.text之前,我将标题放在单独的部分中。

linker.ld

代码语言:javascript
复制
SECTIONS
{
    . = 1M;

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

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

    [snip]

boot.s (GNU作为语法):

代码语言:javascript
复制
.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]

我已经验证了标题部分是否按魔术号指定的方式添加:

代码语言:javascript
复制
kernel.bin:     file format elf32-i386

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

但是Grub 2说内核没有一个有效的多重引导头,并且使用QEMU的-kernel选项导致:

代码语言:javascript
复制
qemu: fatal: Trying to execute code outside RAM or ROM at 0x000a000

它似乎是BIOS映射范围中的一个地址,而不是Multiboot应该在的位置。

我已经将Bran和OSDev中的常规代码(加上以前的内核)进行了比较,但我似乎不知道自己做错了什么。

EN

回答 1

Stack Overflow用户

发布于 2014-04-11 13:57:50

我在多引导内核中也遇到了同样的错误。我得到了同样的错误,.text部分的大小超过了大约4k。造成问题的原因是,在链接时,我首先指定了kernel.o,然后在ld参数中指定了loader.o (我编写了一个Makefile来使我的项目基于OSDev Wiki Bare Bones更适合开发)。Multiboot应该在第一个4k中查找标头,并且随着我的代码的增加,它将头推出这个区域(因为它位于内核.text部分的加载程序之前)。您为多重引导头使用了一个单独的部分,这可能是一个好主意,也可能不是一个好主意,我不知道。我会尝试的事情:

  • 删除.multiboot部分,并将其内容放入加载程序的开头,并确保loader.o是链接器的第一个参数,然后是kernel.o。
  • 使用readelf -a kernel确保多重引导头确实位于第一个4k中(也就是说,如果开头位于0x00100000,则其偏移量低于0x00101000
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17539464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档