看來大多數人真的想要寫一個作業系統,卻不知道從哪裡開始,他們不知道他們需要知道什麼程式語言。
嗯,ㄚ琪也是不知道從哪裡開始,所以剛好看到一些資料,所以我翻譯這篇OS開發入門。
用Q&A的方式來寫可能比較容易懂。
Q:所以我需要知道什麼程式語言來開發自己的作業系統?
A:你至少應該知道組合語言(asm)因為你會需要它來寫開機磁區(bootsector)(下面的問題會解釋)以及相當多其他的東西,我建議你也要學C/C++,因為它是比ASM還要容易瞭解的語言,接著你就可以使用C/C++跟ASM在你的作業系統中,你可能會考慮用Pascal跟 ASM來寫自己的作業系統,而不是用C/C++跟ASM,但是我還是建議使用C/C++跟ASM,(注意用C++跟作業系統的開發有一些特別的問題)。
Q: 什麼是開機磁區(bootsector)?
A: 開機磁區是一個儲存在磁碟片及/或硬碟最前面的很小程式,它負責找到你的核心(你OS的最主要部份做最多事的),載入到記憶體,然後執行。
Q: 我是否必須有一個OS來做一個OS?
A: 是的,大部分的人使用Windows 且/或 Linux來開發OS。
Q: 我應該用什麼編譯器?
A: 對於組合語言來說,我建議NASM因為它是免費的,有好的文件,可以輸出到很多的檔案格式,以及在很多的OS上可用,它也有釋出原始碼,有最多的組合語言範例在需要原始碼的OS dev站上可以找到,對於C/C++ 我建議在Linux下使用gcc,在Windows下使用DJGPP(這兩個彼此相容)。.
Q: 我如何做我的OS可開機磁區?
A: 你會需要輸出到只有機器碼的執行檔,在NASM 使用-f bin,假如你使用
C/C++ 你會需要使用連結器來做(見這一個問題)。
Q: 什麼是連結器,如何使用來開發OS?
A: 連結器會將編譯器產生的輸出檔連結到一個檔案中,對於OS的開發來說,你一般會想到連結你的檔案到機器碼用的執行檔中,對於LD(DJGPP跟gcc最常用到的連結器)使用選項--oformat binary,假如你使用
LD,你應該使用連結器指令碼可以比較好控制連結。
Q: 什麼是真實模式?
A: 真實模式 是x86(386、486、Pentium等等)在你第一次啟動你的PC時的狀態,真實模式有幾個缺點:
- 它缺乏保護,這個能力可以讓程式免於插科打諢和互相碰撞。
- 你只可以做一件工作。
- 你被受限於1MB的位址空間。
- 你必須使用segmentation(分割) 來存取記憶體。
Q: 什麼是保護模式?
A: 保護模式(Protected Mode)(也叫做PMode)是真實模式的加強,保護模式有幾個比真實模式還好的優點:
- 保護模式有保護(Protection),這個能力可以讓程式免於插科打諢和互相碰撞(這就是為什麼叫做保護模式)。
- 你可以同時有幾個工作(像Windows跟Linux)。
- 你有4Gig,是的4 gigabytes的位址空間(一旦A20-Gate啟用見下一個問題)。
- 你可以使用分頁(paging) 來存取記憶體。
如果不是很明顯,你的OS應該是以保護模式在執行除非你特別的理由要使用真實模式。
Q: 什麼是A20匯流排(A20-Gate)?
A: 8086微處理器(這個處理器是在286、386、486、Pentium等等之前的)只能存取1MB的位址空間,對於這個位址範圍,20個位址位元(A0 – A19)是足夠的,然後,Intel發明了80286(通常只叫做”286″),80286可以存取到16MB的位址空間,但是80286必須跟8086相容(做在8086上的程式必須可以在80286上執行),解決的辦法是什麼?為了這個位址範圍要給80286更多的位址匯流,但是有些程式受到這個事實影響,位址只能圍繞在1MB:
讓我們用8086看它的方式來看它:你在兩個系統裡有位址11111111111111111111然後增加1到這個位址,結果是0因為你沒有第21個位元(A20!),但是80286真的有更多的位元,要解決這個問題,Intel讓80286關閉了A20-匯流排,然後限制位址範圍到20位元,所以存取1MB以上的記憶體時,我們需要啟用A20-匯流排。
Q: 什麼是選擇器?
A: 選擇器(有時也叫做描述器)是一個區段的定義,它包含一個基本的區段屬性描述,像是分段基底值(它是開始的位址)以及分段界限值(它的長度),每一個選擇器的長度是64位元,更多的資料在GDT跟LDT的描述裡面。
Q: 什麼是GDT?
A: 全域描述表(gdt)是一個含有選擇器的表格,基本上它提供一個開始位址來定址所有的選擇器。
Q: 什麼是中斷?
A: 中斷是一個中斷目前CPU正在做的工作的一個信號,它告訴CPU一個重要的事件來臨,例如硬體中斷,而CPU需要停止目前的工作並執行適當的中斷處理器,中斷處理器是一個特殊的函式設計來處理一個特定的中斷(像是鍵盤的按鍵),由於中斷有特殊的性能,例如他們可以用來切換ring 3到ring 0,他們可以被用在作業系統中作為系統呼叫使用,Linux系統呼叫透過中斷來處理。
Q: 什麼是PIC?
A: PIC,可程式中斷控制器(Programmable Interrupt Controller),是一個裝置用來收集中斷已經發生的CPU上的硬體中斷的請求和信號,當發生時,PIC跟CPU會溝通那個請求發生,cpu會停止目前的工作以及執行請求的中斷處理器。
Q: 什麼是PIT?
A: PIT,可程式中斷計時器(Programmable Interrupt Timer),是一個可程式(你可以改變速度)的硬體計時器,它激發一個停止的中斷(IRQ 0),它主要用於工作的排程。
Q: 我應該用什麼順序來做我自己的OS?
A: 嗯,你可以從任何地方開始,但是你可能會有無數的錯誤,我建議從製作開機磁區開始,然後做基本的核心,接著增加到你的核心。
Q: 什麼是開機時設定PMode的基本步驟?
A:
- 停用中斷這樣才不會搞得一團糟。
- 設定GDT。
- 啟用A20。
- 設定CR0的第一個位元為1。
- 從GDT載入有正確值的區段暫存器。
- 做一個遠轉移來載入正確值的CS跟EIP。
- 現在你已經在PMode了。
更詳細的內容在Protected Mode by Chris Giese。
Q: 我的問題在這裡沒有答案,我該怎麼辦?
A: 你可以email給Bona Fide,他會設法幫你解答,然後增加到這篇來(這篇教學還有很多沒有完成)。