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