本專題以 30 天實作方式建立作業系統核心基礎。前半段以 RISC-V 為平台,從零實作小型 Kernel,逐步完成開機、例外處理、實體記憶體配置、行程管理、Context Switch、CPU 排程、分頁、User Mode、System Call、VirtIO 與檔案系統。
後半段進入 xv6,對照分析相同機制在 Unix-like 作業系統中的完整實作,並進一步擴充 xv6,加入行程資訊、System Call Trace 與排程統計等觀察功能。
最終完成一套可實際執行與觀察 Kernel 行為的實作成果,建立從 OS 原理、原始碼閱讀到核心開發的完整學習路徑。
平常寫 C 程式時,我們習慣從 main() 開始,也習慣直接使用 printf(),但在 main() 執行以前,其實已經有其他程式幫我們載入可執行檔、準備堆...
先從一行很普通的 C 程式開始:result = add(17, 25)。如果只關心答案,寫到這裡差不多就結束了,但 CPU 並不知道什麼叫 add 函式,也不...
昨天的加法函式可以讀寫暫存器,也可以使用堆疊,但一般應用程式同樣做得到這些事。那麼,核心到底多了什麼權力? 答案不在函式名稱裡,把程式取名為 kernel_ma...
Day 04|Kernel Boot 深入:從 OpenSBI 逐步追到 kernel_main() 如果開機後讀到一個全域變數是零,能證明核心的清零程式真的執...
今天的終端機終於會出現核心自己印出的文字: Hello Kernel! sum=42 hex=2a OpenSBI 的開機資訊和這兩行文字會出現在同一個視窗,...
今天要刻意讓核心印出 PANIC。預期的結束畫面會包含錯誤原因與呼叫位置,而且後面的 unreachable 永遠不該出現。 這個實驗讓核心有一條明確的失敗出口...
今天在 S-mode 執行一條讀取 mstatus 的指令。這個 CSR 需要 M-mode 權限,因此我們預期 CPU 拒絕執行,並讓核心印出 Illegal...
今天讓一個加法算到一半,先觸發例外,再回來完成運算。a0 保存 25,t0 保存 17,handler 會在中途列印診斷資訊,最後我們仍應得到 42。 如果只讓...
今天要配置一頁記憶體,寫入資料,釋放後再配置一次。如果配置器確實回收了那一頁,我們應該拿到相同位址,而且上次留下的資料已經清成零。 到目前為止,核心的空間大多在...
今天讓核心印出兩筆行程資料。它們有不同的 PID、不同的堆疊位址,各自保留入口函式與準備好的 CPU context,狀態都標成 RUNNABLE。 CPU 此...