0

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

.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:无效或不受支持的可执行格式。出了什么问题?有人可以帮我吗?

4

1 回答 1

2

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

请检查以下内容:

  • 您正在使用一个交叉编译器,它为正确的目标编译机器代码,忽略特定于系统的库文件,并使用正确的二进制格式(我推荐 ELF)。
  • GRUB 幻数在内核的前 8KiB 内。确保链接描述文件将 multiboot 标头部分放在首位,然后放在任何其他代码之前。

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

于 2013-10-16T00:52:34.217 回答