3

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

我阅读了如何使多重引导兼容,我正在使用 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;
} 

我正在使用的构建

# 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 运行,但我总是得到

在此处输入图像描述

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

4

1 回答 1

3

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

align 4
multiboot_header:
    dd MBOOT_MAGIC
    dd MBOOT_FLAGS
    dd MBOOT_CHECKSUM

必须存在于 a 下方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
}
于 2014-08-28T14:43:05.017 回答