Как работает код этой сборки загрузчика?

У меня есть следующий код в файле (kernel.asm):

bits 32
section .text
        ;multiboot spec
        align 4
        dd 0x1BADB002               ;magic
        dd 0x00                     ;flags
        dd - (0x1BADB002 + 0x00)    ;checksum. m+f+c should be zero

global start
extern k_main                       ;this is defined in the c file

start:
    cli                             ;block interrupts
    mov esp, stack_space            ;set stack pointer
    call k_main
    hlt                             ;halt the CPU

section .bss
resb 8192                           ;8KB for stack
stack_space:

align 4
dd 0x1BADB002               ;magic
dd 0x00                     ;flags
dd - (0x1BADB002 + 0x00)    ;checksum. m+f+c should be zero

Я проверил код, связал его с ядром, и он отлично работает.

Что значит align 4 имею в виду? Я думаю, что это как-то связано с памятью.

Если линия dd 0x1BADB002 определяет шестнадцатеричный адрес, означающий "плохая загрузка", почему, если операционная система нормально загружается?

Следующая строка dd 0x00Я полагаю, устанавливает все флаги в 0?

dd - (0x1BADB002 + 0x00): похоже делает что-то похожее на вторую строку, добавляя 0 к адресу 0xBADB002, Что означает минус перед скобками? Означает ли минус, что что-то вычитается? Если так, как можно что-то вычесть, если не из чего вычесть? Кроме того, почему 0 добавляется в 0xBADB002? Разве это не то же самое, что 0xBADB002? Имеет ли это значение, если он добавлен или нет?

Я также не понимаю, почему это работает, потому что он работает в 32-битном режиме, а компьютер запускается в 16-битном режиме. Компьютер просто выполняет 32-битный код и вызывает ядро?

заранее спасибо

1 ответ

Решение

Существует стандарт для загрузки различных ядер x86 с помощью загрузчика; называется спецификацией мультизагрузки.

GRUB загрузит наше ядро, только если оно соответствует спецификации Multiboot.

Согласно спецификации, ядро ​​должно содержать заголовок (известный как заголовок Multiboot) в пределах первых 8 килобайт.

Кроме того, этот заголовок мультизагрузки должен содержать 3 поля, которые выровнены на 4 байта, а именно:

a magic field: containing the magic number 0x1BADB002, to identify the header.
a flags field: We will not care about this field. We will simply set it to zero.
a checksum field: the checksum field when added to the fields ‘magic’ and ‘flags’ must give zero.
Другие вопросы по тегам