本專題以 30 天實作方式建立作業系統核心基礎。前半段以 RISC-V 為平台,從零實作小型 Kernel,逐步完成開機、例外處理、實體記憶體配置、行程管理、Context Switch、CPU 排程、分頁、User Mode、System Call、VirtIO 與檔案系統。
後半段進入 xv6,對照分析相同機制在 Unix-like 作業系統中的完整實作,並進一步擴充 xv6,加入行程資訊、System Call Trace 與排程統計等觀察功能。
最終完成一套可實際執行與觀察 Kernel 行為的實作成果,建立從 OS 原理、原始碼閱讀到核心開發的完整學習路徑。
今天的輸出會在 P1 與 P2 之間來回,兩者各自保留 round,也各自使用不同的堆疊。同一顆 CPU 執行一段工作後,保存現場,再從另一份現場繼續,這就是上...
今天增加第三個行程,讓輸出依序出現 P1 → P2 → P3。工作完成一小段後只呼叫 yield(),由核心決定下一個工作,而不是在工作裡寫死接手者。 這就是排...
今天 P1 一開始就進入等待,暫時離開可執行的集合。等 P2 發出喚醒通知,P1 才重新取得排程資格,並繼續原本的工作。 我們會把每次狀態轉換印出來,讓「沒輪到...
今天先往一頁實體記憶體寫入 0x12345678,再從虛擬位址 0x40000000 讀到同一個值。接著透過虛擬位址改成 0xabcdef01,原本的實體頁也會...
昨天證明 0x40000000 能讀到配置的實體頁,今天把位址改成 0x40000034。它應該仍然查到同一個 frame,只是最後的 PA 多出 0x34,也...
今天會產生兩份 ELF:核心的 kernel.elf,以及使用者程式的 user.elf。核心要把後者的機器碼放進一頁 RAM,映射到固定的使用者位址,再準備另...
昨天核心已經把使用者程式放進記憶體,但還沒有執行它。今天要讓終端機出現 U-mode says hello,而且這段文字必須由 U-mode 程式提出輸出請求,...
今天的完成畫面只有一行:Hello from hello.txt on VirtIO disk!。不過,這行文字不能來自使用者程式裡的字串,也不能由核心直接印出...
QEMU 印出 init: starting sh,接著出現 $。這次不必重新編譯核心才能換一個測試,我們可以在 Shell 輸入 echo day19-rea...
今天先讓 QEMU 停在沒有開機文字的狀態。不是核心壞掉,而是我們要趕在主控台初始化以前,看看 CPU 的堆疊與權限模式如何準備完成。 昨天固定了 xv6 版本...