«Не найден мультизагрузочный заголовок» с минимальным ядром - PullRequest
0 голосов
/ 08 мая 2018

Я строю простую ОС с тремя файлами, но у меня проблема с ogg, файлы здесь:

loader.s

.extern kernel_main

.global _start

.set MB_ALIGN,    1<<0
.set MB_MEMINFO,  1<<1
.set MB_MAGIC,    0x1BADB002
.set MB_FLAGS,    MB_ALIGN | MB_MEMINFO
.set MB_CHECKSUM, - (MB_MAGIC + MB_FLAGS)

.section .multiboot
    .align 4
    .long MB_MAGIC
    .long MB_FLAGS
    .long MB_CHECKSUM

.section .bss
    .align 16
    stack_bottom:
        .skip 4096
    stack_top:

.section .text
    _start:
        mov $stack_top, %esp

        call kernel_main

        hang:
            cli
            hlt
            jmp hang

.size _start, . - _start

и kernel.c

#include <stddef.h>
#include <stdint.h>


const int a = 10;

void kernel_main()
{
    uint8_t* video = (uint8_t*) 0xB8000;
    const char* hello = "Hello World! From MYOS";
    for (size_t i = 0; i < 23; i++)
    {
        video[2 * i] = hello[i];
        video[2 * i + 1] = 0x07;
    }
}

и linker.ld

ENTRY(_start);

SECTIONS {
    . = 1M;

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



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


    .rodata BLOCK(4K) : ALIGN(4K)
    {
        *(.rodata)
    }


    .data BLOCK(4K) : ALIGN(4K)
    {
        *(.data)
    }


    .bss BLOCK(4K) : ALIGN(4K)
    {
        *(COMMON)
        *(.bss)
    }
}

и я компилирую этот код:

i686-elf-gcc -std=gnu99 -ffreestanding -g -c start.s -o start.o

i686-elf-gcc -std=gnu99 -ffreestanding -g -c kernel.c -o kernel.o

i686-elf-gcc -ffreestanding -nostdlib -g -T linker.ld start.o kernel.o -o mykernel.elf -lgcc

Я запускаю это ядро, но не найден мультизагрузочный заголовок. если я изменю kernel.c на:

#include <stddef.h>
#include <stdint.h>


const int a = 10; // Just add this line.

void kernel_main()
{
    uint8_t* video = (uint8_t*) 0xB8000;
    const char* hello = "Hello World! From MYOS";
    for (size_t i = 0; i < 23; i++)
    {
        video[2 * i] = hello[i];
        video[2 * i + 1] = 0x07;
    }
}

Его работа! Почему?

...