错误:找不到多引导头

时间:2014-08-27 01:25:45

标签: bare-metal multiboot

这一天发现引起我注意的事情。构建一个简单的裸操作系统

我读了如何使多重引导兼容,我使用NASM和GCC,我需要制作一个具有多重引导头的加载器并调用我的系统的主要点我有两个文件loader.asm和loader .LD

loader.asm
[BITS 32]
global start
start:
    mov esp, _sys_stack
    jmp stublet

ALIGN 4
mboot:
    MBOOT_PAGE_ALIGN        equ 1<<0
    MBOOT_MEMORY_INFO       equ 1<<1
    MBOOT_HEADER_MAGIC      equ 0x1BADB002
    MBOOT_HEADER_FLAGS      equ MBOOT_PAGE_ALIGN | MBOOT_MEMORY_INFO
    MBOOT_CHECKSUM          equ -(MBOOT_HEADER_MAGIC + MBOOT_HEADER_FLAGS)

    ; This is the GRUB Multiboot header. A boot signature
    dd MBOOT_HEADER_MAGIC
    dd MBOOT_HEADER_FLAGS
    dd MBOOT_CHECKSUM

stublet:
    EXTERN cmain
    call cmain
    jmp $
SECTION .bss
    resb 8192

_sys_stack:
loader.ld
ENTRY(start)
phys = 0x00100000;
SECTIONS
{
    .text phys : AT(phys) {
        code = .;
        *(.text)
        *(.rodata)
        . = ALIGN(4096);
    }
    .data : AT(phys + (data - code))
    {
        data = .;
        *(.data)
        . = ALIGN(4096);
    }
    .bss : AT(phys + (bss - code))
    {
        bss = .;
        *(.bss)
        . = ALIGN(4096);
    }
    end = .;
}
main.c
int GenyKernel_Main()
{
    char *str = "Hello world!", *ch;
    unsigned short *vidmem = (unsigned short*) VIDEO_MEMORY;
    unsigned i;

    for (ch = str, i = 0; *ch; ch++, i++) {
        vidmem[i] = (unsigned char) *ch | 0x0700;
    }

    return 0;
} 

for build i&#39; m using

# loader.o
nasm -f elf64 -o loader.o loader.asm
# main.o
gcc -fno-stack-protector -fno-builtin -nostdinc -O -g -Wall -I. -c -o main.o main.c 

和最后的链接

ld -T loader.ld -o kernel loader.o main.o

我用grub-mkrescue构建了一个简单的iso并使用qemu运行但是我总是得到

enter image description here

我认为问题出在文件loader.ld中,但我找不到

1 个答案:

答案 0 :(得分:1)

在阅读了很多关于同一个.asm文件后,我终于明白了问题,下面的代码片段

align 4
multiboot_header:
    dd MBOOT_MAGIC
    dd MBOOT_FLAGS
    dd MBOOT_CHECKSUM

必须存在于section以下才能适当地包含链接器

section .text ; .multiboot o whatever
align 4
multiboot_header:
    dd MBOOT_MAGIC
    dd MBOOT_FLAGS
    dd MBOOT_CHECKSUM

和链接描述文件

ENTRY(your_entry_point)
SECTIONS
{
  . = 0x00100000;
  .text ALIGN(0x1000) :
  {
    *(.multiboot)
    *(.text)
  }
  // rest of sections
}