這份文件將教你如何撰寫與建立你的第一個作業系統,使用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的基本暫存器列表:
2013年2月20日 星期三
如何設計簡單的作業系統
Labels:
OS
嗨,大家好!我是一位資訊人、畫畫人、科技人和行銷人。定位自己為網路觀察家,永遠保持好奇心與熱情,學習跨領域新事物,希望最終能成為一個全方位的人。喜歡探索新技術和創意,並將其應用於工作和生活中。也喜歡畫畫、旅行、閱讀和寫作。希望我的部落格可以為您帶來啟發和樂趣,並與您分享我的經驗和見解。謝謝您的訪問,期待與您交流!
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言