2015-12-09 39 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

Mulitboot兼容的ELF对象(如您在此处创建的对象)有一些遵循的规则。一个Mulitboot映像必须包含一个特定的头文件,其中声明了多引导代码的功能,使用魔术值0x1BADB002,以便多引导加载程序可以确认它正在加载的是多引导兼容的。要求标题信息落在可执行文件的前8k内,并且它与4字节边界对齐。如果未在标头之前使用“align 4”,可能会导致多引导加载程序将您的可执行文件视为不符合mulitboot标准 –

回答

1

有一个使用引导装载程序加载各种x86内核的标准;称为多重引导规范。

如果符合Multiboot规范,GRUB将只加载我们的内核。

根据规范,内核必须在其前8 KiloBytes内包含一个头部(称为Multiboot头部)。

此外,此多重引导头必须包含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. 
相关问题