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

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 理論與技術。

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

讀者留言 (4)

  • Vinx 於 July 24, 2008 23:27:

    有一个问题,这个boot only的系统是指从ARM的RESET HANDLER开始呢还是从bootloader(uboot)读入内核开始呢,
    我想应该是从bootloader以后开始比较好吧,之前的东西和OS没有多大关系,纯粹是ARM的设置...

  • harlan 於 July 25, 2008 08:59:

    Jollen你好.

    市面上有一本"如何撰寫作業系統"的書籍, 後來又出了一本針對特定嵌入式系統而出的續集.

    兩本書大略都會提到 bootloader 做的事情, 不過是以 trace code 為導向為主. 有些部分在 x86 底下的概念就非常模糊. 例如記憶體管理上面, real mode 和 protected mode 上面.

    在 ARM 系統上也會遇到記憶體管理問題, 這部分可能會比開機流程 / interrupt 等等更難說明.

  • orionlin 於 July 25, 2008 12:37:

    這是我今天見到最好的訊息了!我認為做一個會開機的簡單os只是這個課程第一里程碑,我建議可以再用相同的理念來建構其他的方案如簡單的nas、router等. 我相信可以吸引很多人來,我支持你們不錯的理念!讚啦!

  • jollen 於 July 25, 2008 13:41:

    @Vinx:

    是由 u-boot 載入 kernel 之後開始。主要還是著重在 arch/ 部份,OS 本身也會講只是不多。例如:以 boot only 來講,沒有 system call,也沒有 blocking I/O,所以排程方面也只談到 context-switch。

    @harlan:

    嗯,我們會去參考此書的內容。本課程在 bootloader 這裡我想並不會著墨。

    @orionlin:

    謝謝!我們會繼續努力的 ;-)

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。