環境
- 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 彙編程式。