@Denys557

Error: no multiboot header found при загрузке своей ОС, как исправить?

Я начал писать свою ОС, но при ее запуске на виртуальной машине выдает такую ошибку:
error: no multiboot header found
Предполагаю что проблема в boot.s либо в linker.ld
Помогите пожалуйста, или хотя бы дайте намек на то, в чем ошибка

boot.s:

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

.section .multiboot
.align 4
.long 0x1BADB002   
.long 0x0          
.long -(0x1BADB002)

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

.section .text
.global _start
.type _start, @function
_start:

	mov $stack_top, %esp

	call kernel_main

	cli
1:	hlt
	jmp 1b

.size _start, . - _start


linker.ld:

ENTRY(_start)

SECTIONS
{
    . = 1M;

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

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

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

    .bss BLOCK(4K) : ALIGN(4K)
    {
        *(COMMON)
        *(.bss)
    }
}
  • Вопрос задан
  • 120 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Нужны подробности сборки. Согласно спецификации заголовок multiboot должен быть в пределах 8192 байт от начала, но если в сборку не подсовывать никаких дополнительных ключей и потом пытаться загружать elf-файл, то в нём multiboot header может оказаться дальше 8К от начала:

$ gcc -m32 boot.s -nodefaultlibs -nostartfiles -Wl,-Tlinker.ld -no-pie -o boot.elf
$ readelf -S boot.elf
There are 8 section headers, starting at offset 0x3140:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .note.gnu.bu[...] NOTE            00100000 001000 000024 00   A  0   0  4
  [ 2] .multiboot        PROGBITS        00101000 003000 00000c 00      0   0 4096
  [ 3] .text             PROGBITS        00102000 002000 000009 00  AX  0   0 4096
  [ 4] .bss              NOBITS          00103000 003000 004000 00  WA  0   0 4096
  [ 5] .symtab           SYMTAB          00000000 00300c 0000a0 10      6   9  4
  [ 6] .strtab           STRTAB          00000000 0030ac 00004d 00      0   0  1
  [ 7] .shstrtab         STRTAB          00000000 0030f9 000044 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  D (mbind), p (processor specific)


При такой сборке секция .multiboot оказалась по смещению 0x3000.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы