[翻譯]如何開始開發本身的操做系統

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

Abootsector被存在你的軟驅或者硬盤最前端的小程序。它用來幫助找到你的內核(這是你操做系統的主要部分),而且把它加載到內存中,而且運行它。


Q:是否是我不得不在一個操做系統上去寫的個人操做系統?

A:是的,不少人使用MS Windows或者Linux來開發他們的操做系統。


Q:我應該使用什麼編譯器?

A:對於彙編語言來講,我建議使用NASM,由於他是免費的,有很好的文檔,能夠輸出不少文件格式,而且支持大多數操做系統,咱們能夠找到不少可用的源代碼示例。對於C/C++來講,我建議使用Linux的朋友使用gccMS 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(實模式)?

AReal Mode是一個當你打開x86(386,486,Pentium,etc)電腦時的CPU狀態。Real Mode有如下幾個劣勢:

它缺少保護,而且缺少阻止程序與其餘程序發生混亂和衝突的能力

也許你只有一個任務

你最多隻有1兆的地址空間。

你必須分段去訪問內存。


Q:什麼是Protected Mode(保護模式)?

AProtected Mode(還稱做PMode)是一個Real Mode的進階模式。Protected Mode相對Real Mode有如下幾個優點:

Protected Mode是被保護的,這個是一個去阻止程序與其餘程序發生衝突混亂的能力(這是Protected Mode的名字的由來)。

也許你只有幾個任務(就像WindowsLinux)。

你有4G的內存空間,是的4G。(一次使A20-Gate可用,看下一個問題)。

你可使segmentation(段)去訪問內存。


若是這還不夠明顯,那除非你有一個很是特殊的緣由去使用Real Mode,不然你的操做系統須要運行在Protected Mode下。


Q:什麼是A20-Gate

A8086微處理器(也就是在286386486,奔騰等以前的Intel處理器)能夠尋址(access1MB的地址空間(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

Aselector(有些狀況也被叫作descriptor)是一個分段的定義。它包含了基礎段屬性的一個描述。像基段(它是內存的開始)和段的極限(它的長度)。每一個selector都有64 位長。關於它的更多描述,咱們能夠看GDTLDT


Q:什麼是GDT

AGDT是一個包含selector的表。簡單的說,它爲尋址全部的selector提供了一個開始地址。


譯者注 start


這裏關於GDT的解釋很是少,因此我再解釋一下

GDT全稱是Global Descriptor Table

在咱們實際使用CPU的時候,確定是同時執行N個程序,每一個程序都會有本身的內存空間,所以咱們要爲每一個程序聲明本身的內存空間。

因此要使用GDT(中文是啥我也不知道)。

內存會被分紅若干個segmentation(段)。

這樣咱們就能夠爲每一個程序聲明ORG 0,可是在聲明以前,咱們須要爲每一個segmentation聲明一些信息:

段(segment)的大小

段在內存中的開始位置

段的管理屬性,好比只讀,系統專用等。


以上內容參考自tetsu的博客,我會在Reference List寫下它的地址。

譯者注 end


Q:什麼是interrupt(中斷)?

Ainterrupt是一箇中斷如今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:什麼是PICProgrammable Interrupt Controller)?

APIC是能夠編程的interrupt(中斷)控制器,它是一個能夠在CPU發生中斷時捕獲硬件中斷請求和信號的裝置。當它發生時,PICCPU會交流發生的那個請求,並且CPU會中斷如今的任務而且爲那個請求執行interrupt handler


Q:什麼是PIT

APITProgrammable Interrupt Timer)可編程中斷計時器,是一個可編程(你能夠改變它的速度)硬件計時器,當它消失的時候(IRQ 0)它會快速的發送(fires off => to quickly send a message or give instructions)一箇中斷。它主要被用於任務調度。


Q:我應該按照什麼順序去開發個人操做系統?

A:事實上你能夠從任何地方開始,可是你能夠最後被各類bug終結。我建議你能夠先寫一個bootsector,而後再寫一個基礎的內核,最後再一點點的完善這個內核。


Q:在啓動時都須要什麼基礎步驟才能引導進PModeProtected Mode => 保護模式)?

A

禁用全部中斷,這樣就沒有事情能困擾你了。

設置GDT

使A20可用

設置CR0的第一位爲1

GDT中爲段寄存器加載正確的值

從作一個for jump那裏爲CSEIP加載正確的值

你如今已經在PModeProtected 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

相關文章
相關標籤/搜索