Ошибка "no multiboot header found" возникает при попытке загрузки вашей операционной системы. Как можно решить эту проблему?

Я начал разработку своей операционной системы, но при попытке ее запуска на виртуальной машине возникает следующая ошибка: <br/> error: no multiboot header found <br/> Я предполагаю, что проблема может заключаться в файлах boot.s или linker.ld. Можете ли вы помочь мне разобраться, в чем может быть ошибка, или дать подсказку для её исправления? <br/> <br/> Вот содержимое boot.s: <br/> <br/> <pre><code>.set ALIGN,    1&lt;&lt;0            
.set MEMINFO,  1&lt;&lt;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</code></pre> <br/> <br/> А вот содержимое linker.ld: <br/> <br/> <pre><code>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)
    }
}</code></pre>
  • 19 сентября 2024 г. 20:53
Ответы на вопрос 2
Ошибка "no multiboot header found" может возникать по нескольким причинам. В вашем случае, в первую очередь, стоит проверить правильность настроек в файлах `boot.s` и `linker.ld`.

1. **Проверка multiboot заголовка**: Убедитесь, что заголовок Multiboot действительно создаётся правильно. В вашем `boot.s` вы определяете заголовок как:
   
   ```assembly
   .section .multiboot
   .align 4
   .long 0x1BADB002   
   .long 0x0          
   .long -(0x1BADB002)
   ```

   Проверьте, что логика вычисления Checksum (последняя строка) верна и совпадает с форматом заголовка Multiboot. По сути, checksum рассчитывается как отрицательное значение (SUM) от суммы MAGIC, FLAGS и остальных значений. Попробуйте изменить вашу строку с checksum на:

   ```assembly
   .long -(MAGIC + FLAGS)
   ```

2. **Правильное размещение .multiboot секции**: Проверьте, что в `linker.ld` вы указали правильное описание секции. У вас уже есть:

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

   Убедитесь, что секция `.multiboot` помещается в начало изображения операционной системы.

3. **Корректная установка точки входа (ENTRY)**: Убедитесь, что точка входа (`ENTRY`) в `linker.ld` совпадает с вашим `_start` в `boot.s`:

   ```ld
   ENTRY(_start)
   ```

   Если `_start` не действительно определён, это может вызвать проблемы.

4. **Компиляция и линковка**: Убедитесь, что вы компилируете и связываете ваши файлы правильно. Примерная команда:
   ```bash
   gcc -ffreestanding -c boot.s -o boot.o
   ld -T linker.ld -o kernel.bin boot.o
   ```

5. **Проверка выравнивания и границ памяти**: Можете добавить выравнивание для секций, так как неправильно выставленные границы могут нарушить порядок загрузки:
   - Каждый блок данных должен быть согласован (4 байта).
   - Проверьте, что вы используете правильный адрес, когда устанавливаете начальные значения сегмента стека.

6. **Использование загрузчика**: Убедитесь, что ваш загрузчик (например, GRUB) настроен правильно и указывает на правильный файл (например, `kernel.bin`) с нужными параметрами.

Если вы проверите и измените эти моменты, это может помочь вам устранить ошибку "no multiboot header found". Если проблема сохраняется, изучите вывод отладчика или загрузчика на предмет более подробной информации о том, где именно возникает ошибка.
Нужны подробности сборки.
Похожие вопросы