🚀 核心目標

隨著 OS 功能增加,代碼量迅速膨脹。今天的目標是將混亂的根目錄結構進行模組化重組,並引入 Makefile。這能確保編譯過程的一致性,並精確控制核心代碼在記憶體中的排列順序。


1. 調整後的工程目錄結構

一個專業的 OS 專案需要清晰的層次感。我們將代碼劃分為「啟動區(Boot)」與「內核區(Kernel)」。

SmallOS/ ├── src/ # 原始碼目錄 │ ├── boot/ # 啟動相關 (boot.asm, gdt.asm, kernel_entry.asm, etc.) │ └── kernel/ # 內核相關 │ ├── cpu/ # CPU 底層 (IDT, GDT, Interrupts) │ ├── drivers/ # 硬體驅動 (VGA, Keyboard) │ └── kernel.c # 核心主程式 ├── build/ # 編譯輸出的中間物件 (.o) 與二進位檔 (.bin) ├── Makefile # 編譯控制文件 └── os-image.bin # 最終合成的磁碟鏡像


2. 為什麼需要 Makefile?

在 Day 6,我們手動執行了多條 gccld 指令。當檔案變成 10 個、20 個時,手動操作極易出錯。Makefile 幫我們解決:

  1. 自動依賴檢查:只編譯有修改過的檔案,節省時間。
  2. 精確鏈結順序:確保 kernel_entry.o 永遠排在 kernel.bin 的最前面。
  3. 一鍵運行:整合 make run 指令,自動完成編譯、拼接、啟動 QEMU。

3. 深入解析 Makefile 編譯參數 (Compiler Flags)

在這次更新的 Makefile 中,我們加入了一些 OS 開發專用的參數,這些參數能防止編譯器「自作聰明」: