This tutorial is written by K.J. and Joachim Nock. Updated 2002.11.20 by K.J. php
原文地址:http://www.osdever.net/tutorials/view/getting-started-in-os-development 前端
譯者能力有限,歡迎砍磚,共同進步 編程
正文開始 小程序
目前看來確實有不少人想要寫一個本身的操做系統,可是他們不知道到底從哪開始,並且他們不知道到底都須要掌握哪些計算機語言。 函數
其實,讓我開始寫我本身的操做系統的時候,我確實也經歷了這樣的問題。所以我寫了這個如何開始開發操做系統的教程。 學習
我寫了個Q&A表來幫助你們理解。 ui
Q:要寫一個本身的操做系統,我都應該掌握哪些計算機語言? spa
A:你須要至少知道彙編語言(ASM),由於你將使用它去寫一個bootsector(下面會解釋這個問題)以及很多其它的事情。我還建議你須要學習C/C++,與彙編語言相比它更好理解一些。你能夠把它們都用在你的操做系統中。你可能會想使用Pascal和彙編去替代C++,可是我建議使用C/C++和彙編。(記住這裏有一些關於C++和操做系統開發的特別的問題) 操作系統
Q:什麼是bootsector(引導扇區)? .net
A:bootsector被存在你的軟驅或者硬盤最前端的小程序。它用來幫助找到你的內核(這是你操做系統的主要部分),而且把它加載到內存中,而且運行它。
Q:是否是我不得不在一個操做系統上去寫的個人操做系統?
A:是的,不少人使用MS Windows或者Linux來開發他們的操做系統。
Q:我應該使用什麼編譯器?
A:對於彙編語言來講,我建議使用NASM,由於他是免費的,有很好的文檔,能夠輸出不少文件格式,而且支持大多數操做系統,咱們能夠找到不少可用的源代碼示例。對於C/C++來講,我建議使用Linux的朋友使用gcc,MS Windows平臺下的朋友使用DJGPP。(它們是相互兼容的)。
Q:怎麼作才能讓個人操做系統的bootsector啓動起來?
A:你須要輸出一個二進制文件。若是你使用NASM的話,你須要使用-f bin參數,若是你使用C/C++的話你須要一個linker(鏈接器)去作這些事情(下面會介紹linker)。
Q:什麼是linker,我應該怎麼把它用在個人開發中。
A:一個linker能夠把編譯器生成的文件連接成一個文件。在操做系統開發過程當中,你將會常常想要把你的文件連接成一個龐大的2進制文件。對於LD(大多數人通常都會與DJGPP或者gcc一塊兒使用鏈接器)咱們須要使用—oformat binary參數。若是你使用LD的話,你可能還須要一個linker script(連接腳本)去控制的你連接。見My suggestions for making your OS。
http://www.osdever.net/mysuggestions.php
譯者注:連接已經失效
Q:什麼是Real Mode(實模式)?
A:Real Mode是一個當你打開x86(386,486,Pentium,etc)電腦時的CPU狀態。Real Mode有如下幾個劣勢:
它缺少保護,而且缺少阻止程序與其餘程序發生混亂和衝突的能力。
也許你只有一個任務
你最多隻有1兆的地址空間。
你必須分段去訪問內存。
Q:什麼是Protected Mode(保護模式)?
A:Protected Mode(還稱做PMode)是一個Real Mode的進階模式。Protected Mode相對Real Mode有如下幾個優點:
Protected Mode是被保護的,這個是一個去阻止程序與其餘程序發生衝突混亂的能力(這是Protected Mode的名字的由來)。
也許你只有幾個任務(就像Windows和Linux)。
你有4G的內存空間,是的4G。(一次使A20-Gate可用,看下一個問題)。
你可使segmentation(段)去訪問內存。
若是這還不夠明顯,那除非你有一個很是特殊的緣由去使用Real Mode,不然你的操做系統須要運行在Protected Mode下。
Q:什麼是A20-Gate?
A:8086微處理器(也就是在286,386,486,奔騰等以前的Intel處理器)能夠尋址(access)1MB的地址空間(access space)。對於這個尋址範圍,20根地址線(A0-A19)已經足夠了。在Intel發明了80286(一般被叫作286)以後。80286須要尋址到16MB的尋址空間,可是80286倒是和8086同樣的(這是爲了保證哪些爲8086開發的程序也能一樣運行在80286上)。
那解決方案是什麼呢。首先必需要給80286更多的地址門,可是一些程序已經依賴於這1MB的地址空間。
讓咱們看看在這種狀況下8086看到了什麼:你有一個地址:11111111111111111111,當你要給它加1的時候,結果倒是0。緣由是你沒有第21位(A20)。可是80286確實有不少位。
爲了解決這個問題,Intel創造了80286 A20-Gate關閉模式,這種狀況下,地址範圍就是20位。所以,爲了尋址超過1MB的內存,咱們必須打開A20-Gate。
Q:什麼是selector?
A:selector(有些狀況也被叫作descriptor)是一個分段的定義。它包含了基礎段屬性的一個描述。像基段(它是內存的開始)和段的極限(它的長度)。每一個selector都有64 位長。關於它的更多描述,咱們能夠看GDT和LDT。
Q:什麼是GDT?
A:GDT是一個包含selector的表。簡單的說,它爲尋址全部的selector提供了一個開始地址。
譯者注 start
這裏關於GDT的解釋很是少,因此我再解釋一下
GDT全稱是Global Descriptor Table
在咱們實際使用CPU的時候,確定是同時執行N個程序,每一個程序都會有本身的內存空間,所以咱們要爲每一個程序聲明本身的內存空間。
因此要使用GDT(中文是啥我也不知道)。
內存會被分紅若干個segmentation(段)。
這樣咱們就能夠爲每一個程序聲明ORG 0,可是在聲明以前,咱們須要爲每一個segmentation聲明一些信息:
段(segment)的大小
段在內存中的開始位置
段的管理屬性,好比只讀,系統專用等。
以上內容參考自tetsu的博客,我會在Reference List寫下它的地址。
譯者注 end
Q:什麼是interrupt(中斷)?
A:interrupt是一箇中斷如今CPU任務的信號。它告訴CPU你要接受一個重要的事件。舉個硬件中斷的例子,CPU須要中斷如今的任務去運行中斷捕獲者(interrupt handler => 中斷處理函數)。這個中斷捕獲者(中斷處理函數)是一個特別的功能,它被設計去捕獲(handle => 處理)一些具體的中斷(好比從鍵盤輸入文字)。對中斷來說他們有不少特別的特性,舉個例子,他常被用於去把ring 3轉換成ring 0(they can be used to switch from ring 3 to ring 0),它們在操做系統中可能被用於作一個系統呼叫。
譯者注 start
這個是程序的運行級別, ring 0級是最高級別, 一般是系統內核運行的, 而ring 3是最低級別, 一般就是咱們的應用程序運行的級別.
擴展閱讀:
Wikipedia => 用戶態 => http://zh.wikipedia.org/wiki/%E7%94%A8%E6%88%B7%E6%80%81
Wikipedia => Ring (computer security) => http://en.wikipedia.org/wiki/Ring_(computer_security)
筆者會在深刻學習後,把上面這篇文章翻譯了。
感謝@Nemesis_E comrade抓錯,你好用心啊。
譯者注 end
Q:什麼是PIC(Programmable Interrupt Controller)?
A:PIC是能夠編程的interrupt(中斷)控制器,它是一個能夠在CPU發生中斷時捕獲硬件中斷請求和信號的裝置。當它發生時,PIC和CPU會交流發生的那個請求,並且CPU會中斷如今的任務而且爲那個請求執行interrupt handler。
Q:什麼是PIT?
A:PIT(Programmable Interrupt Timer)可編程中斷計時器,是一個可編程(你能夠改變它的速度)硬件計時器,當它消失的時候(IRQ 0)它會快速的發送(fires off => to quickly send a message or give instructions)一箇中斷。它主要被用於任務調度。
Q:我應該按照什麼順序去開發個人操做系統?
A:事實上你能夠從任何地方開始,可是你能夠最後被各類bug終結。我建議你能夠先寫一個bootsector,而後再寫一個基礎的內核,最後再一點點的完善這個內核。
Q:在啓動時都須要什麼基礎步驟才能引導進PMode(Protected Mode => 保護模式)?
A:
禁用全部中斷,這樣就沒有事情能困擾你了。
設置GDT
使A20可用
設置CR0的第一位爲1
從GDT中爲段寄存器加載正確的值
從作一個for jump那裏爲CS和EIP加載正確的值
你如今已經在PMode(Protected Mode)了
有一篇Chris Giese寫的叫作Protected Mode的文章覆蓋了更多的細節
連接是http://www.osdever.net/tutorials/pm.php
譯者注:之後我會翻譯這篇文章。翻譯後我會改掉這個連接。
Q:個人問題不在這裏,那我應該作什麼
A:你能夠發給我email,我會試着回答你,而且把你的問題添加到這篇文章裏(這個教程離完成還遠者呢)。
譯者注:做者的郵箱是:osdev@reallyneatmail.zzn.com
感謝
@Nemesis_E 幫我抓錯
@楊同窗 錯別字,第一個回覆
@閒塵 提出翻譯指正
@海上添翼
@陳陽陽陽
@RGW
注:但願OSCHINA早日出@人功能
Reference List
對GDT的解釋(上) => http://tetsu.iteye.com/blog/403407