2013年2月20日 星期三

如何設計簡單的作業系統



這份文件將教你如何撰寫與建立你的第一個作業系統,使用x86組合語言。它將說明你需要什麼,PC啟動過程的基礎,與組合語言。完成的作業系統很小(足以進入一個啟動載入器)且有很少的功能,但是它是一個好的開始。

你閱讀完這份教學後,可以查看MikeOS專案,它是一個x86組合語言的作業系統,你可以閱讀它來增進你的技術。

需求

有程式設計經驗是必須的。假如你已經有過高階語言設計的經驗,像是PHP或Java,但你將會需要低階語言的經驗像是C,特別是記憶體或是指標的主題。

這個教學中我們使用Linux作業系統。作業系統的開發也可以在Windows,但是它並不像Linux這般容易,在Linux中你可以取得一個完整的工具箱。Linux也能容易地建立磁碟片與CD-ROM影像檔─你不需要安裝繁瑣的程式。

在今天安裝Linux是很容易的;假如你想要雙系統,你可以取得Ubuntu並安裝它到VMware或VirtualBox。當你進入到Ubuntu,你可以參考這份教學,進入終端機視窗並取得所有需要的工具:

sudo apt-get install build-essential qemu nasm

這個指令你將取得開發工具箱(編譯器等等)。QEMU 電腦模擬器與NASM組譯器,它將轉換組合語言為機器能執行的語言。

PC入門

假如你要撰寫一個x86電腦的作業系統(這是個好選擇,因為有大量文件可以供你參考),你將需要了解一部個人電腦的啟動流程。幸運地,你不需要深入知道複雜的主題,像是圖形驅動程式或網路協定,你將專注於需要的部分。

當一部個人電腦開機,它會執行BIOS(基本輸入輸出系統),是一個迷你的作業系統被建置在系統中。它實現一些硬體的測試(例如記憶體檢查)和噴射出圖形(例如Dell圖標)或檢測文字到螢幕上。之後,當它做完了,它會啟動並載入作業系統,從任何可以找到作業系統的媒體。許多個人電腦會跳到硬碟,並啟動他們在Master Boot Record(MBR)中找到的可執行碼,一個硬碟開始的512位元組區段;有些會試著在磁片(boot sector)或CD-ROM中找到可執行碼。

這是根據啟動順序─你可以在BIOS的選項螢幕中設定他們。BIOS從所選擇的媒體中載入512位元組到它的記憶體,並開始執行它。這是一個啟動載入器,這隻小程式會載入主要的作業系統核心或一個大的啟動程式(例如Linux系統中的GRUB/LILO)。這個512位元組的啟動載入器後面有兩個特別的數字,用來告訴作業系統它是一個啟動區域,我們將在之後介紹。

個人電腦的啟動是一個有趣的特色。歷史上,許多個人電腦有磁片,所以能從BIOS中設定為啟動媒體。時至今日,然而,許多個人電腦不再使用磁片裝置─只有使用CD-ROM─為了迎合它。當你從CD-ROM啟動,它將會模擬一個磁片裝置;BIOS讀取CD-ROM裝置,載入大量的資料,執行它像是一個磁片裝置。這對於我們作業系統的開發者而言不是有用的,當我們為我們的作業系統建立磁片,但仍然是在只有CD的機器啟動它。(磁碟裝置是較容易處裡的,但CD-ROM的檔案系統就不是這麼簡單了)

所以,啟動過程是;
1. 給電:個人電腦啟動,並開始執行BIOS程式碼。
2. BIOS查看許多媒體像是磁片裝置或硬碟。
3. BIOS載入一個512位元組的啟動磁區從指定的媒體並開始執行它。
4. 512位元組然後載入作業系統,或者是一個更複雜的啟動載入器。

對於MikeOS而言,我們有一個512位元組的啟動載入器,那裡我們寫入一個磁片映像檔(一個虛擬的磁片)。我們能注射磁片映像檔到CD,所以個人電腦只要有CD-ROM裝置就可以執行。
另一種方式,BIO載入它,假如它在一個磁片上,開始執行它。我們就能控制系統。

組合語言入門

許多現代的作業系統都使用C/C++撰寫。這是個好用且具有移植性且容易維護的語言,但是它也增加了許多複雜的層。對於你的第一個作業系統,你最好從組合語言做起,它也被使用在MikeOS。它是很冗長的且沒有移植性的,但你不用擔心編譯器或連結器的問題。此外,你需要了解一點組合語言。

組合語言(簡稱asm)是用文字的方式來表示CPC執行的一段指令。例如:一個指令用來移動一些記憶體到CPU可能是11001001 01101110─但是這是很難閱讀的!所以組合語言提供可以記憶的方式來取代這些指令,像是mov ax,30。有了他們就不用使用無意義的二進位數字。

就像許多程式語言,組合語言有一個指令列表。你可以跳躍到不同的地方,且能這定副函式與方程式。你不能只是印出"Hello world"到螢幕上─CPU不懂螢幕上的什麼!換句話說,你需要對記憶體工作,操作一堆RAM,執行運算,並將結果放到對的位置。聽起來很複雜嗎?

在組合語言階層,這裡沒有高階語言裡面所說的變數的觀念。然而有的只是一堆暫存器,在CPU記憶體中。你可以放數字到暫存器中,並執行計算。在16位元模式中,這些暫存器可以放0到65535個數字。這裡有一個對於x86CPU的基本暫存器列表:


沒有留言: