У меня есть следующий код в файл (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-битный код и вызывает ядро?
Заранее спасибо
это мультизагрузочные совместимые изображения. «Magic/flags/checksum» являются частью заголовка многозадачности. Он должен быть загружен с помощью загрузчика, который понимает мультизагрузку и переключается на 32-битный защищенный режим для вас (например, 'grub'). PS: Не поймите меня неправильно, но если вы даже не можете узнать, что означает 'align', вы, вероятно, не должны смотреть на такие продвинутые вещи. – Jester
Пожалуйста, прочитайте [this] (http://arjunsreedharan.org/post/82710718100/kernel-101-lets-write-a-kernel) пост, он очень хорошо разбирается, чем любой возможный ответ, который я мог бы написать. Кроме того, помните о различиях между директивами NASM, такими как 'global' и синтаксисом x86, например' dd'. – 0x90
Объекты ELF, совместимые с Mulitboot, такие как тот, который вы создаете здесь, имеют некоторые правила. Изображение Mulitboot должно содержать определенный заголовок, который, среди прочего, объявляет возможности многозадачного кода, использует магическое значение 0x1BADB002, поэтому мультизагрузочный загрузчик может подтвердить, что он загружается, совместим с несколькими загрузками. Существует требование, чтобы информация заголовка попадала в первые 8k exectuable и была выровнена с 4-байтовой границей. Невозможность использовать 'align 4' перед заголовком, вероятно, заставит мультизагрузочный загрузчик видеть ваш исполняемый файл как совместимый с mulitboot. –