iT邦幫忙

鐵人檔案

2026 iThome 鐵人賽
回列表
Software Development

打造 OS Kernel:從 OS in 1,000 Lines 到 xv6 系列

本專題以 30 天實作方式建立作業系統核心基礎。前半段以 RISC-V 為平台,從零實作小型 Kernel,逐步完成開機、例外處理、實體記憶體配置、行程管理、Context Switch、CPU 排程、分頁、User Mode、System Call、VirtIO 與檔案系統。
後半段進入 xv6,對照分析相同機制在 Unix-like 作業系統中的完整實作,並進一步擴充 xv6,加入行程資訊、System Call Trace 與排程統計等觀察功能。
最終完成一套可實際執行與觀察 Kernel 行為的實作成果,建立從 OS 原理、原始碼閱讀到核心開發的完整學習路徑。

參賽天數 22 天 | 共 22 篇文章 | 0 人訂閱 訂閱系列文 RSS系列文
DAY 1

Day 01|作業系統到底在做什麼?建立我們的 Tiny Kernel 專案

平常寫 C 程式時,我們習慣從 main() 開始,也習慣直接使用 printf(),但在 main() 執行以前,其實已經有其他程式幫我們載入可執行檔、準備堆...

2026-09-11 ‧ 由 日班工頭 分享
DAY 2

Day 02|RISC-V 101:Kernel 開發前先搞懂 CPU 如何執行程式

先從一行很普通的 C 程式開始:result = add(17, 25)。如果只關心答案,寫到這裡差不多就結束了,但 CPU 並不知道什麼叫 add 函式,也不...

2026-09-12 ‧ 由 日班工頭 分享
DAY 3

Day 03|Privilege Mode:Kernel 為什麼比 Application 有權力?

昨天的加法函式可以讀寫暫存器,也可以使用堆疊,但一般應用程式同樣做得到這些事。那麼,核心到底多了什麼權力? 答案不在函式名稱裡,把程式取名為 kernel_ma...

2026-09-13 ‧ 由 日班工頭 分享
DAY 4

Day 04|Kernel Boot 深入:從 OpenSBI 逐步追到 kernel_main()

Day 04|Kernel Boot 深入:從 OpenSBI 逐步追到 kernel_main() 如果開機後讀到一個全域變數是零,能證明核心的清零程式真的執...

2026-09-14 ‧ 由 日班工頭 分享
DAY 5

Day 05|Hello Kernel:沒有 OS 時我們怎麼把文字印出來?

今天的終端機終於會出現核心自己印出的文字: Hello Kernel! sum=42 hex=2a OpenSBI 的開機資訊和這兩行文字會出現在同一個視窗,...

2026-09-15 ‧ 由 日班工頭 分享
DAY 6

Day 06|Kernel Panic:核心出錯時怎麼停下來並找出問題?

今天要刻意讓核心印出 PANIC。預期的結束畫面會包含錯誤原因與呼叫位置,而且後面的 unreachable 永遠不該出現。 這個實驗讓核心有一條明確的失敗出口...

2026-09-16 ‧ 由 日班工頭 分享
DAY 7

Day 07|Exception 與 Trap:CPU 如何突然跳進 Kernel Handler?

今天在 S-mode 執行一條讀取 mstatus 的指令。這個 CSR 需要 M-mode 權限,因此我們預期 CPU 拒絕執行,並讓核心印出 Illegal...

2026-09-17 ‧ 由 日班工頭 分享
DAY 8

Day 08|Trap Frame:進 Kernel 前 CPU 的暫存器去了哪裡?

今天讓一個加法算到一半,先觸發例外,再回來完成運算。a0 保存 25,t0 保存 17,handler 會在中途列印診斷資訊,最後我們仍應得到 42。 如果只讓...

2026-09-18 ‧ 由 日班工頭 分享
DAY 9

Day 09|Kernel 怎麼管理 RAM?實作自己的 Page Allocator

今天要配置一頁記憶體,寫入資料,釋放後再配置一次。如果配置器確實回收了那一頁,我們應該拿到相同位址,而且上次留下的資料已經清成零。 到目前為止,核心的空間大多在...

2026-09-19 ‧ 由 日班工頭 分享
DAY 10

Day 10|Process 是什麼?第一次建立兩個 Kernel Process

今天讓核心印出兩筆行程資料。它們有不同的 PID、不同的堆疊位址,各自保留入口函式與準備好的 CPU context,狀態都標成 RUNNABLE。 CPU 此...

2026-09-20 ‧ 由 日班工頭 分享