Как работает код этой сборки загрузчика?
У меня есть следующий код в файле (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.