GRUB说错误13:无效或不支持的可执行格式

时间:2013-10-16 00:17:10

标签: kernel

我写了一个内核。这是我的内核启动文件:

.text
    .globl start
start:
jmp main

mboot:
 .set ALIGN,    1<<0
.set MEMINFO,  1<<1
.set FLAGS,    ALIGN | MEMINFO
.set MAGIC,    0x1BADB002
.set CHECKSUM, -(MAGIC + FLAGS)

.section multiboot
.align 4
.long MAGIC
.long FLAGS 
.long CHECKSUM
main:
call kernel_main
    cli
    hlt

这是我的第一个C档案:

void print(char *message, int line,int ch){
     char *vm=(char *)0xb8000;
     int i=(line*80*2);
     i=i+(ch*2);
     while(*message!=0){
     if (*message=='\n'){line++;
     i=(line*80*2);}
     else {vm[i]=*message;
     i++;
     vm[i]=0x07;
     i++;} *message++;}}

基于此我写了第二个C文件:

#include "ESfunctions.c" //this is the previous C file 
kernel_main(){
print("Hi!\nHow do you like my OS?",0,0);}

编辑:这是我的链接器脚本:

OUTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS
{
  .text  0x100000 : {
    code = .; _code = .; __code = .;
    *(.text)
    . = ALIGN(4096);
  }
  .data  : {
    data = .; _data = .; __data = .;
    *(.data)
    . = ALIGN(4096);
  }
  .bss  :
  {
    bss = .; _bss = .; __bss = .;
    *(.bss)
    . = ALIGN(4096);
  }
  end = .; _end = .; __end = .;
}

编辑:我没有使用交叉编译器。我在Ubuntu上使用gcc。

我编译了C代码并汇编了汇编代码并将它们链接在一起。然后我把它变成了一个可引导的图像,并与grub一起把它全部刻录到光盘上。 grub启动后,我输入命令“kernel KERNEL.BIN”(KERNEL.BIN是我的内核)并且grub说“错误13:无效或不支持的可执行格式。有什么问题?有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

在不知道你的链接器脚本或Makefile(请附上它们)的情况下,我们只能猜出可能出现的问题。

请检查以下内容:

  • 您正在使用交叉编译器为正确的目标编译机器代码,省略系统特定的库文件,并使用正确的二进制格式(我建议使用ELF)。
  • GRUB幻数位于内核的前8KiB内。确保链接描述文件在任何其他代码之前放置多引导头部分。

我会把它作为评论而不是答案,但我还没有足够的声誉。