该汇编引导加载程序代码如何工作?

2 x86 assembly nasm

我在文件 ( 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:
Run Code Online (Sandbox Code Playgroud)
align 4
dd 0x1BADB002               ;magic
dd 0x00                     ;flags
dd - (0x1BADB002 + 0x00)    ;checksum. m+f+c should be zero
Run Code Online (Sandbox Code Playgroud)

我已经测试了代码,将其与内核链接,并且工作正常。

这是什么align 4意思?我认为这与记忆力有关。

如果该行dd 0x1BADB002定义了一个十六进制地址,表示“启动不良”,那么如果操作系统加载正常,为什么它还会存在?

下一行dd 0x00,我假设将所有标志设置为 0?

dd - (0x1BADB002 + 0x00): 似乎在做与第二行类似的事情,将 0 添加到地址中0xBADB002。括号前面的减号是什么意思?减号是否意味着正在减去某些东西?如果是的话,如果没有什么可以减去的话,怎么能减去呢?另外,为什么要0添加到0xBADB002?和 不是一样的吗0xBADB002?加与不加有什么区别吗?

我也很困惑为什么会这样,因为它是 32 位的,而计算机以 16 位实模式启动。计算机只是执行32位代码并调用内核吗?

提前致谢

Ali*_*Ali 5

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

\n\n

GRUB 仅在符合多重引导规范的情况下才会加载我们的内核。

\n\n

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

\n\n

此外,此多重引导标头必须包含 3 个 4 字节对齐的字段,即:

\n\n
a magic field: containing the magic number 0x1BADB002, to identify the header.\na flags field: We will not care about this field. We will simply set it to zero.\na checksum field: the checksum field when added to the fields \xe2\x80\x98magic\xe2\x80\x99 and \xe2\x80\x98flags\xe2\x80\x99 must give zero.\n
Run Code Online (Sandbox Code Playgroud)\n