2015-12-09 2 views
0

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

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

+2

это мультизагрузочные совместимые изображения. «Magic/flags/checksum» являются частью заголовка многозадачности. Он должен быть загружен с помощью загрузчика, который понимает мультизагрузку и переключается на 32-битный защищенный режим для вас (например, 'grub'). PS: Не поймите меня неправильно, но если вы даже не можете узнать, что означает 'align', вы, вероятно, не должны смотреть на такие продвинутые вещи. – Jester

+0

Пожалуйста, прочитайте [this] (http://arjunsreedharan.org/post/82710718100/kernel-101-lets-write-a-kernel) пост, он очень хорошо разбирается, чем любой возможный ответ, который я мог бы написать. Кроме того, помните о различиях между директивами NASM, такими как 'global' и синтаксисом x86, например' dd'. – 0x90

+0

Объекты ELF, совместимые с Mulitboot, такие как тот, который вы создаете здесь, имеют некоторые правила. Изображение Mulitboot должно содержать определенный заголовок, который, среди прочего, объявляет возможности многозадачного кода, использует магическое значение 0x1BADB002, поэтому мультизагрузочный загрузчик может подтвердить, что он загружается, совместим с несколькими загрузками. Существует требование, чтобы информация заголовка попадала в первые 8k exectuable и была выровнена с 4-байтовой границей. Невозможность использовать 'align 4' перед заголовком, вероятно, заставит мультизагрузочный загрузчик видеть ваш исполняемый файл как совместимый с mulitboot. –

ответ

1

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

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

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

Кроме того, этот Мультизагрузочный заголовок должен содержать 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. 
Смежные вопросы