gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:15:10 25 4
gpt4 key购买 nike

我在文件 (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 位代码并调用内核吗?

提前致谢

最佳答案

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

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

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

此外,此多重引导 header 必须包含 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.

关于assembly - 该汇编引导加载程序代码如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34183799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com