OS設計

這一篇文章來自舊的alt.os.development新聞主題,每一行有">"的部份是由Ian Nottingham所寫,其餘的部份是由Alistair J. R. Young所寫,ㄚ琪茲將其翻成中文分享給華人的朋友。

> Hey…我已經試著開始設計核心一段時間了,但是所有我看的範例都已經遠超過最早開始的
>階段,我沒辦法瞭解從哪裡開始並且什麼時候該做什麼…有人有開發初期的範例嗎?或是可能有一篇指南
>還是有需要做什麼的清單?

我要說的第一件事就是你需要考慮的是”沒有”完整的子系統可以開始,關於核心我發現最有趣的一件事就是每件事跟其餘的事都有有五六個的相依關係- 所以同時你會留下五六個子系統的小片段程式要開發。

如果你是從頭開始,或許你需要做的第一件事就是開發一大堆的小巨集跟函式來把一個漂亮的臉放在X86架構比較雜亂的位元上,如果你真的雄心勃勃,你可以嘗試,並使其成為一個可攜式或至少是一個半攜式的臉。:)

(我真的相信假如你對撰寫大量低階PC-硬體-雜湊值的組合語言程式不感興趣的話,那將會是有很多無聊細節的時間要消磨,我建議你可以取得Utah Oskit {文中所列為v. 0.96,但ㄚ琪查閱之後已經有0.97版,不過這些版本真的都很舊了,約在2002年出來的}這裡所有的資料都可以拿來用)。

你也需要一堆核心的函式庫(不是strcmp()、不是strcpy()、不是malloc()等等,當然,所以…?)- 加上assert()及panic()逐行的偵錯函式。

同時,你*真的*需要現在做你主要設計的決策,否則你會落到跟我現在一樣的狀況 – 必須摧毀這個東西然後重做一遍那可是*很大的*痛苦。

第一件大事就是記憶體模式,分段且/或分頁?如今看起來,大部分的人要分頁而不要分段 – 因為平面記憶體模式是較好的,且因為分頁通常是可相容的而分段卻不能。

再者你要放核心在哪?你允許每個程序有個別的位置空間嗎,或是混合在一起?虛擬記憶體?

然後就是多工/緒,假如你決定有這個功能,或許最關鍵的就是一開始,它是否可能將你的程式碼將永遠在對稱多處理機(SMP)上執行?假如是,你需要從一開始就放進所有的自旋鎖跟其他同步的東西 – 回想到這件是是一個*很難想像的*惡夢。

你的行程模式為何?只是基本的兩階的行程-擁有-執行緒,或是一些更複雜的?(我自己現在使用三階的互動式交談/工作/設施擁有行程擁有執行緒的模式),當你處理工作交換時,你將要寫你自己的程式碼來做這件事,或是用Intel提供的工作狀態分段(task-state segment,TSS)來做,假如是後者,你將要走整套得方法並讓每個執行緒有一個TSS,或是有兩個及交換相應的資訊進出無作用的資訊在每次的工作交換前及之後?

系統呼叫,你如何處理?有幾個可能 – Linux,以及其它的,似乎使用軟體中斷,所以那是相當的流行,其他的選項 – 呼叫閘到來讓使用模式的程序直接呼叫相應的核心函式,或只是有一個呼叫送出訊息到IPC連接埠。

而提到IPC – 訊息連接埠?具名管道?佇列?本地通訊端?上述所有部份?現在最好想一下,因為它會大大影響你其餘的設計 – 你可能想要有一個基本的然後實作其它所有的條款(在
Laura,舉個例來說,一切幾乎是基本的訊息連接埠的衍生 – 而它會影響TCP/IP堆疊的設計(網路 – 這是另外要想到的)。

Ich,設備驅動程式 – 要如何討論這些?以及檔案系統,這真的都是複用式的主題,簡言之,總有Unix的模式是你把所有的事情都當成檔案來處理並且透過檔案系統來存取,或許有更奇特的選項在那裡等待 – 再次使用我自己的核心做例子,Laura模式有一個’命名空間管理員’會列出系統的每個物件 – 設備、檔案系統及他們自己的檔案等等,要存取每個設備、檔案不管什麼東西,你詢問命名空間管理員而它針對這個物件給你一個(回憶之前的)IPC連接埠 – 且每個註冊的事情可以完全支援一系列訂製的動作,不只是標準的open()、close()、 read()、write()、ioctl()…

安全!假如你想要有,現在就想想,它幾乎比SMP改裝還要遜,至少假如你想要避免每個地方有安全漏洞的話,而且有這麼多不同的方法來做到這一點 – 我自己使用物件存取控制表驗證可能的三個不同的權杖(token)而這是基於相關的執行緒、工作及交談來處理的。

嗯,這是所有的設計東西,但這在我的書中是最重要的,我的意思是先把它做完,否則,最後你會花很多時間來摧毀跟重寫。

一旦你真的開始放程式碼到鍵盤…嗯,(除非你使用一樣東西),你需要的第一件事就是粗略的控制台驅動程式,這個程式幾乎確定不會是你使用驅動控制抬得最後一個版本,但是試著不用printf()來偵錯絕對是一個混蛋…

那麼 – 讓我看看,它很多取決於你的OS是如何的佈局(再一次談到設計:) )以及那些相關的事務,很明顯地,首先你需要的是啟動核心的程式碼(假如你使用多重開機啟動程式,或是某些類似的,這比較不會那麼痛苦,使用像它這樣的東西來開始甚至是稍後你計畫寫你自己的啟動程式可能是一個不錯主意)以及做最基本的設定(讓分段設定正確、配置核心堆積及堆疊來工作等等…等等)。

然後,我的第一步是寫東西,用來顯示啟動和停止的旗幟(這樣我就可以真正看到東西發生什麼事 – 這總是一個好處!)然後,在這上面建構 – 讓我們來看看,我的第一個步驟是重寫那個要顯示旗幟,然後進入系統閒置狀態(也就是最後變成限制執行緒的迴圈),那就*真的*比只用’for (;;) ;’ 還複雜了 – 我認為在這期間停止處理器避免使用過多電力是一個好主意,但是…

我認為下一件事可以拿來做的就是陷阱處理(trap handling)或許是個好主意- 即使,在這個階段,你所能做的就是顯示一個訊息、列印狀態以及核心的錯誤(依我所見,這應該是你預設的處理器),這訊息會在稍後偵錯的時後派上用場(比只是崩潰還有用),這在你已經有了一個架構時可以更快地實作真正的處理器。

同樣的事就是中斷的處理,我覺得這可能是名單上需要處理的下一件事,但我不會對一個無法預期的中斷感到恐慌。

在此之後 – 嗯,做好後它會依賴你現在正在做的核心,我的下一個步驟就是獲得一個處理器來跑時間的中斷 – 幾乎所有的事情都會使用系統的定時器來做*某些事*,所以這是非常必要的,而且,我也需要排程器來工作,所以…

Utah OSKit 可以在http://www.cs.utah.edu/flux/oskit/找到。

ㄚ琪發現翻譯這篇硬體的英文,對我來說難度頗高的,因為很多專業名詞是沒有接觸過的,有機會繼續涉獵囉。

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *