可以開機就好:談作業系統的基礎訓練

jollen 發表於 July 24, 2008 3:50 PM

最近在和朋友在討論 Embedded Linux 課程的規劃事宜,希望可以歸納過去所收集的學員意見,以及就助教所提出的課堂問題,對現有課程做調整以及精進。二個星期前,和 thinker 以及 dennis 在聊課程時,興起了一個念頭,我們想要規劃一門「作業系統」的課程。

過去的教育訓練發現,有些學員對於作業系統的背景知識不足,也有些學員對於 Linux kernel 的原理很有興趣,更有些學員對如何寫一個 OS 感興趣,但,由於沒有系統化的文件提供這方面的資訊,因此,讓大家只能由片斷的文件(googling)自己拼湊相關知識,不但沒有效率,而且也經常徒勞無功。

我們想要做的「作業系統」課程,可不是把「恐龍書」搬出來教一教就行了,而是希望走「實務」路線,因此,thinker 提出了一個想法:教大家做一個「只能開機」的 OS。我跟 dennis 都覺得這是一個很不錯的構想,透過「建構式」教學,讓大家從無到有自己寫一個作業系統,這個作業系統也不需要很完整,只要能做到「可以開機」就好了。

昨天晚上,大家再次聚會,再討論了這個「boot only」的 OS。「從無到有自己寫」是一個不太可行的做法,畢竟訓練時數有限,況且「有現成的 Linux kernel」可以用,因此,「從 Linux kernel 剪貼程式碼來做一個新的 OS」是一個最具體可行的做法,也是大家的共識。

透過由 Linux kernel「copy-and-paste」程式碼,拼裝出一個 OS,是一件有意義的事情。雖然是一個拼裝的 OS,但是要讓它可以動,就要了解處理器架構,以及整個開機流程,而且也要知道「要讓一個 OS 可以開機,至少要實作什麼單元。」這是一件有趣的事,大家興趣都來了,一陣技術討論後,很快地,在不到一個小時內,我們就把主題都抓出來了。初步的構想如下。

要知道 Linux kernel 的開機流程,就要有一個學習環境,我們一致認為,透過 Qemu 模擬器與 gdb 進行 source-level debug 會是一個很不錯的做法,而且也可以在拼湊的同時,透過 Qemu 來測試與除錯;最後再將拼裝好的 OS 實際放到開發板上做測試。我們自己的 JK2410 開發板,同時也提供 JK2410 模擬器,所以可以繼續延用我們的「Jollen-Kit! 嵌入式系統專用學習平臺」。

有了學習環境後,就可以開始討論「最小型的作業系統」需要實作什麼功能。理論來說,實作出 clock、IRQ handler、virtual memory 以及 context-switch 就可以讓 OS 開機,並且提供「最最最」簡單的功能,比如「Hello, World!」。要能成功 copy-and-paste 出可放到 ARM9 開發板開機的 OS,除了要對 Linux kernel 的 BSP 本身很熟悉外,也要對這些技術的實作細節掌握得很好,所以,用 Linux kernel 來從無到有打造一個自己的 OS 可說是一舉三得的方法:

1. 可以了解 Linux 的 BSP(board-support package)做法,以及開機流程。
2. 可以了解 ARM architecture。
3. 可以學習最根本的 OS 理論與技術。

目前,我們已經完成課程的規劃,不久後也會完成講義的初步規劃。這是一個頗有意義的主題,而且也是一個很好的學習途徑,希望對這個主題有興趣的朋友,可以提供意見或想法給我們。

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw