我在文件 ( 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位代码并调用内核吗?
提前致谢
使用引导加载程序加载各种 x86 内核有一个标准;称为多重启动规范。
\n\nGRUB 仅在符合多重引导规范的情况下才会加载我们的内核。
\n\n根据规范,内核必须在其前 8 KB 内包含一个标头(称为 Multiboot header)。
\n\n此外,此多重引导标头必须包含 3 个 4 字节对齐的字段,即:
\n\na 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
归档时间: |
|
查看次数: |
3031 次 |
最近记录: |