0170-Multiboot2 啟動頭

波尔發表於2024-07-13

環境

  • Time 2022-11-11
  • WSL-Ubuntu 22.04
  • QEMU 6.2.0
  • NASM 2.15.05

前言

說明

參考:https://os.phil-opp.com/multiboot-kernel/

目標

編寫一個符合 multiboot2 規範的啟動檔案。

multiboot2 規範

https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html#Header-tags
規範定義文件如上,其中的 3.1.1,3.1.2,3.1.3 介紹了啟動檔案需要符合的格式。

Field Type Value
magic number u32 0xE85250D6
architecture u32 0 for i386, 4 for MIPS
header length u32 total header size, including tags
checksum u32 -(magic + architecture + header_length)
tags variable
end tag (u16, u16, u32) (0, 0, 8)

可以看到上面定義的都是無符號數,其中的 checksum(校驗和)+ magic + architecture + header_length 需要等於零。要使無符號數 u32 等於 0,可以使其剛好產生溢位,結果回到 0,即(0x100000000)。

彙編程式碼

section .multiboot_header
header_start:
    dd 0xe85250d6                ; 魔法數字,固定值
    dd 0                         ; 0 表示進入 32 位保護模式
    dd header_end - header_start ; 標頭檔案的長度
    ; 校驗和,因為都是使其加起來一共等於 0
    dd 0x100000000 - (0xe85250d6 + 0 + (header_end - header_start))

    ; 可選的標籤

    ; 結束標籤
    dw 0    ; type
    dw 0    ; flags
    dd 8    ; size
header_end:

編譯和檢視機器碼

root@jiangbo12490:~/git/game# nasm main.asm
root@jiangbo12490:~/git/game# hexdump -x main
0000000    50d6    e852    0000    0000    0018    0000    af12    17ad
0000010    0000    0000    0008    0000
0000018
root@jiangbo12490:~/git/game#

總結

瞭解了 multiboot2 的啟動規範,定義和實現了其 header 彙編程式。

附錄

相關文章