🚩 核心目標

計畫趕不上變化,但穩紮穩打才是核心。 在 Day 7 的預告中,我們原定要實現 VGA 顯示驅動。然而,在實作過程中,我們意識到若沒有一套可靠的底層工具(如字串處理、數字轉換)與類型定義,顯示驅動的代碼將會變得混亂且難以調試。

因此,Day 8 我們決定優先建立「內核工具箱」,並引入 Host-side Testing (離線測試) 機制,確保這些最基礎的邏輯在進入硬體層面前是 100% 正確的。


1. 內核基礎庫成員

為了確保內核的自足性(Self-sufficiency),我們實作了以下三個模組:


2. 離線測試機制 (Host-side Testing)

「不要在核心中測試邏輯,要在主機上測試。」 由於上述工具不涉及硬體 I/O,我們可以直接在 Linux/WSL2 環境下使用系統的 gcc 進行編譯與驗證。

🛠️ 測試專用 Makefile

這份 Makefile 獨立於核心編譯系統,專門用於鏈結內核庫與測試案例:

# tests/Makefile

HOST_CC = gcc
# 加入 -fno-builtin 防止主機 C 庫函式干擾自定義實現
CFLAGS = -g -Wall -fno-builtin -I../src/kernel/lib -DHOST_TESTING

# 目錄定義
SRC_LIB_DIR = ../src/kernel/lib
TEST_LIB_DIR = kernel/lib
BUILD_DIR = build
OBJ_DIR = $(BUILD_DIR)/lib_objs

# 1. 獲取所有內核庫源文件並定義對應的 Object 檔案
LIB_SRCS = $(wildcard $(SRC_LIB_DIR)/*.c)
LIB_OBJS = $(patsubst $(SRC_LIB_DIR)/%.c, $(OBJ_DIR)/%.o, $(LIB_SRCS))

# 2. 獲取所有測試源文件
TEST_SRCS = $(wildcard $(TEST_LIB_DIR)/test_*.c)
# 轉換路徑:將 tests/kernel/lib/test_string.c 轉為 build/test_string
TEST_BINS = $(patsubst $(TEST_LIB_DIR)/test_%.c, $(BUILD_DIR)/test_%, $(TEST_SRCS))
TEST_NAMES = $(patsubst $(TEST_LIB_DIR)/test_%.c, %, $(TEST_SRCS))

# 防止 make 自動刪除 .o 檔案
.PRECIOUS: $(OBJ_DIR)/%.o

# --- 目標規則 ---

.PHONY: test_all clean $(TEST_NAMES)

# 執行所有測試
test_all: $(TEST_BINS)
	@echo "======================================="
	@echo "   Running All Kernel Library Tests    "
	@echo "======================================="
	@for bin in $(TEST_BINS); do \\
		echo "Executing $$bin..."; \\
		./$$bin || exit 1; \\
		echo "---------------------------------------"; \\
	done
	@echo "All tests passed successfully!"

# 規則 A:編譯內核庫的所有 .c 檔案為 .o (主機環境)
$(OBJ_DIR)/%.o: $(SRC_LIB_DIR)/%.c
	@mkdir -p $(OBJ_DIR)
	$(HOST_CC) $(CFLAGS) -c $< -o $@

# 規則 B:編譯測試程序並連結「所有」內核庫 Object
$(BUILD_DIR)/test_%: $(TEST_LIB_DIR)/test_%.c $(LIB_OBJS)
	@mkdir -p $(BUILD_DIR)
	@echo "Linking $@ with all library objects..."
	$(HOST_CC) $(CFLAGS) $^ -o $@

# 單獨執行命令 (例如: make string)
# 注意:這裡對應的是 test_string.c,所以輸入 make string 會執行 build/test_string
$(TEST_NAMES): %: $(BUILD_DIR)/test_%
	@echo "Executing $<..."
	@./$<

clean:
	rm -rf $(BUILD_DIR)

🧪 測試執行與驗證

透過以下方式,我們可以在不啟動 QEMU 的情況下快速確認字串轉換等邏輯是否無誤:

make string (測試string相關函式)
make util (測試和數字到字符串轉換的函式)
make math (測試數學函式)
make test-all (運行所有測試)