自己動手寫操作系統--"Hello, OS world!"

自己動手寫操作系統--"Hello, OS world!"

       作者:zieckey([email protected])

1、開發環境與工具

開發環境:winxp+sp2
必須安裝Bochs-2.3,nasm,UltraEdit.
下載nasm後,添加nasm所在目錄到到path目錄,建議直接將nasm放到windows或system32目錄,方便從命令行調用.
下載地址:http://sourceforge.net/projects/nasm

2、準備

下載並解壓縮bochs後,安裝和一般的windows軟件安裝一樣,注意爲了方便學習,安裝時選擇完全安裝,即要選擇那個dlxlinux。你可以在它的目錄中找到一個名爲bximage.exe的程序,這個程序可以爲我們創建磁盤鏡像文件,我們可以在這些磁盤鏡像文件上嘗試我們的操作系統,而不必實際改動我們的硬盤或是軟盤上的數據,畢竟,在沒有實際把握之前,我們不願意給我們的計算機帶來什麼不可恢復的傷害。

下面的表格顯示了一次bximage.exe的運行。它爲我們創建了一個名爲boot.img的文件,這個文件是一張容量爲1.44m的軟盤的鏡像。

 


========================================================================
                                bximage
                  Disk Image Creation Tool for Bochs
        $Id: bximage.c,v 1.32 2006/06/16 07:29:33 vruppert Exp $
========================================================================

Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] fd

Choose the size of floppy disk image to create, in megabytes.
Please type 0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, or 2.88.
 [1.44]
I will create a floppy image with
  cyl=80
  heads=2
  sectors per track=18
  total sectors=2880
  total bytes=1474560

What should I name the image?
[a.img] boot.img

Writing: [] Done.

I wrote 1474560 bytes to boot.img.

The following line should appear in your bochsrc:
  floppya: image="boot.img", status=inserted
(The line is stored in your windows clipboard, use CTRL-V to paste)

Press any key to continue


3、創建自己的引導程序boot.asm

org 07c00h ; 告訴編譯器程序加載到 7c00處

                      mov ax, cs

                      mov ds, ax

                      mov es, ax
                      
                      call DispStr ; 調用顯示字符串例程

                      jmp $ ; 無限循環

                DispStr:

                      mov ax, BootMessage
                      
                      mov bp, ax ; es:bp = 串地址

                      mov cx, 16 ; cx = 串長度

                      mov ax, 01301h ; ah = 13, al = 01h
                      
                      mov bx, 000ch ; 頁號爲 0(bh = 0) 黑底紅字(bl = 0Ch,高亮)

                      mov dl, 0
                      
                      int 10h ; 10h 號中斷

                      ret

                BootMessage: db "Hello, OS world!"
                
                     times 510-($-$$) db 0 ; 填充剩下的空間,使生成的二進制代碼恰好爲

                                                    ; 512字節
                      dw 0xaa55 ; 結束標誌

          
4、編譯源文件並複製到軟驅鏡像文件中                 
                      
我的Bochs安裝在“D:/SoftTools/Bochs-2.3” ,在該目錄下創建一個HelloOS的目錄,
以便爲後的工作做好準備。將boot.asm保存在“D:/SoftTools/Bochs-2.3/HelloOS” ,
同時將上面創建的“boot.img”也保存到“HelloOS”下。
下面我們利用上面提到的彙編編譯器nasm將上面的彙編程序編譯下:
C:/Documents and Settings/apple>d:

D:/>cd D:/SoftTools/Bochs-2.3/HelloOS

D:/SoftTools/Bochs-2.3/HelloOS>nasmw boot.asm -o boot.bin

D:/SoftTools/Bochs-2.3/HelloOS>

這之後,你將得到一個名爲boot.bin的純二進制文件,大小正好爲512字節。
用UltraEdit編輯器打開這個文件,你可以看到這個文件中有一半以上的字節爲0,最後兩個字節爲55和aa。
 
然後,用你的編輯器打開boot.img,把boot.bin中的內容全部複製到其中。
值得注意的是,你應該把內容複製到boot.img的開始處,也就是說,複製後的內容佔用了boot.img的0x000到0x1ff字節。
值得一提的是,如果複製數據不一樣,請確保選擇:UltraEdit編輯器 -〉編輯-〉剪貼板-〉用戶剪貼板1,
這樣應該就不會有什麼問題了。

5、寫配置文件

爲了配置的簡單起見,將“D:/SoftTools/Bochs-2.3/dlxlinux”目錄下的“bochsrc.bxrc”和“run.bat”
兩個文件複製到“HelloOS”下。我們只要稍微的修改下“bochsrc.bxrc”和“run.bat” 這兩個文件就好了。

“bochsrc.bxrc”修改後的文件如下:

###############################################################
# bochsrc.txt file for zieckey's first OS boot disk image.
###############################################################

# how much memory the emulated machine will have
megs: 32

# filename of ROM images
romimage: file=../BIOS-bochs-latest, address=0xf0000
vgaromimage: file=../VGABIOS-lgpl-latest

# what disk images will be used
floppya: 1_44=boot.img, status=inserted
#floppyb: 1_44=floppyb.img, status=inserted

# hard disk
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
#ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17

# choose the boot disk.
boot: floppy

# default config interface is textconfig.
#config_interface: textconfig
#config_interface: wx

#display_library: x
# other choices: win32 sdl wx carbon amigaos beos macintosh nogui rfb term svga

# where do we send log messages?
log: bochsout.txt

# disable the mouse, since DLX is text only
mouse: enabled=0

注意上面的幾個重要修改地方:
1) 註釋掉帶有"hd10meg.img" 的行,這是
# hard disk
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
#ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17
2) 啓動項應該爲軟驅啓動,這與我們前面做的軟驅鏡像一直
# choose the boot disk.
boot: floppy

“run.bat”修改後的文件如下:
cd "D:/SoftTools/Bochs-2.3/HelloOS"
../bochs -q -f bochsrc.bxrc


6、運行我們的第一個簡陋的操作系統(或者說系統引導程序)

雙擊“bochsrc.bxrc”或者“run.bat”,這時候會跳出兩個窗口,其中一個應該是這樣的:

Hello, OS world!Bios 0.6a 19 Aug 2006
This VGA/VBE Bios is released under the GNU LGPL

Please visit :
 . http://bochs.sourceforge.net
 . http://www.nongnu.org/vgabios

Bochs VBE Display Adapter enabled

Bochs BIOS - build: 08/11/06
$Revision: 1.166 $ $Date: 2006/08/11 17:34:12 $
Options: apmbios pcibios eltorito


Booting from Floppy...


第一行的“Hello, OS world!”就是我們要看到的結果。

7、下面對Bochs的用法作一個簡單的說明

bochs用法 BOCHS是一個開源的虛擬機。它可以實現vpc和vmware的大部分功能。你也可以像使用vmware一樣的在BOCHS裏面安裝操作系統。但是,由於它是全模擬的。所以,速度要遠遠慢於vmware.這樣看來BOCHS好像沒有什麼優勢.是這樣嗎?在應用方面的確如此。但是,在其他一個方面它是處於絕對優勢的。那就是它具有調試功能!這是一個讓人振奮的功能。這個功能在你調試操作系統或者其他一些在裸機上運行的程序時候,會讓你有一種在寫 windows下運行的應用程序的感覺。有時候它是我們的救命稻草。沒了它,也能活,但是肯定要糟糕的多。好了我們開始切入正題。
一、 配置BOCHS
實際上配置BOCHS是很簡單的,爲什麼很多人不會配置呢?我覺的就是因爲他使用和配置方式和普通程序不一樣——配置文件。實際上配置文件是和ini文件、bat文件類似的。bochs沒有給我們提供圖形界面的配置工具。這就需要我們自己來修改配置文件。簡單的配置就可以讓你的操作系統在BOCHS裏面跑起來。用BOCHS跑完整的linux和windows是不現實的。實在是太慢了。一般我們也只能把他當成調試器來使用。現在,我們先看一下如何讓 dos在他裏面跑起來。
如果你細心的話你會發現在BOCHS文件夾裏面有一個bochsrc-sample.txt的文本文件。裏面包含了所有了BOCHS參數的信息。這個是官方的教程。可惜是英文的,而且我也沒有找到有中文的教程(不然也沒有我這篇文章)。在這裏我們僅僅介紹最簡單的配置選項。好了,廢話就不多說了。我們現在就開始。
我們以一個例子來說明,這個例子是我用來跑dos以及我自己的小操作系統的。下面就是我們要用到的最基本的選項:

# 在一行的最前面加上“#”表示這一行是註釋行。
# 內存,以MB爲單位,對於dos來說最大可以訪問16MB
# 的內存,所以我就給了他16MB,你可以根據自己的機器來調
# 整
megs: 16
# 下面兩句一般是不可以改的,至於幹什麼用的就不用我說
# 了。從他們的文件名就可以看出來。
romimage: file=../BIOS-bochs-latest, address=0xf0000
vgaromimage: file=../VGABIOS-lgpl-latest
# 這個還用說嗎?當然是軟驅了,我想我們寫操作系統肯定是先
# 把操作系統放在軟盤(或映像)裏面吧?在BOCHS裏面是可
# 以使用任意大小的軟驅映像的。可以是1.44或2.88,我一般使
# 用2.88。還有就是BOCHS裏面可以使用兩個軟驅。不過好像
# 我們並不經常這樣做。
floppya: 2_88=test.img, status=inserted
#floppyb: 1_44=floppyb.img, status=inserted
# 下面是硬盤,很簡單,還有就是BOCHS也是可以支持多個硬
# 盤的。那麼,硬盤文件是怎麼生成的呢?我們可以發現硬盤是
# img格式的。你注意沒有在BOCHS文件夾裏有一個工具叫
# bximage.exe,我想你應該猜出來了。他就是用來生成這個硬盤
# 文件的工具。我在這兒還想說的是硬盤分三種格式的,最好選
#用growing類型。這種有一個好處就是節省硬盤空間,不過使用
#這種類型的硬盤還需要在下面加上mode = growing這個選項。
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="dos.img", cylinders=306, heads=4, spt=17
# 下面這個就是光驅,沒什麼好說的。如果你想使用物理光驅,
# 只要讓path=E:(我們假設E盤是光驅)
ata0-slave: type=cdrom, path="dos.iso", status=inserted
# 這個是啓動設備,可以使用cdrom(光驅)、c(硬盤)或floppy(軟
# 驅)。
#boot: cdrom
boot: c
#boot: floppy
# 這一句可以不要,他只是指定用來保存日誌的文件。如果不指定的
# 話他就會輸出到命令控制檯上。
log: bochsout.txt
# 這一句是設置在開機時是否激活鼠標,BOCHS對於鼠標的控制不是
# 很好。建議如果不是特別需要的話不要激活他。在運行期間也可以點窗口右上角的鼠標圖標來激活他。
mouse: enabled=0

 

以上這些設置就可以讓你的DOS或自己的小操作系統在BOCHS裏面跑起來了。至於其他的一些高級支持,你可以查看bochsrc-sample.txt裏面的說明。不要害怕他,其實很簡單。關鍵是拋棄恐懼。

有幾個重要的參數再做詳細說明:
第一個參數:floppya這是A驅動器的參數,當然,自然也是模擬的。通常所用的軟驅是1。44MB的,因此後面跟的參數是1_44=/dev/fd0 注意,這個/dev/fd0必須是你的軟驅的鏡像,比方說咱們的msdos就是msdos.img,你把/dev/fd0改成1_44= msdos.img就可以,當然,也可以模擬其它的軟驅,如2。88M,720K,360K的,這非常的有用!你裝minix1.5版的時候就知道了,網站上download的都是360K,說明那是360K的磁盤,你可以模擬除360K的軟驅使用。後面的參數status標明軟驅的狀態,只能有兩個 inserted(軟盤插入軟驅),ejected(軟盤未插入軟驅)。完整的就是floppya: 1_44=msdos.img, status=inserted,別的軟驅如B類似。
       第二個參數:boot,這是啓動的驅動器,它的頻率也比較高。它可以帶的參數有floppy(軟驅啓動),disk(磁盤啓動),cdrom(光驅啓動)。
       這兩個參數是最最常用的,幾乎是必用吧。嗯~~下面的參數是關於硬盤的,有些麻煩,也算是比較常用吧。
       第三個參數:ata0,ata1,ata2,ata3,這應該算是四個參數吧,沒事別改它,反正我是沒改過它,還常常吧後面的ata1,ata2,ata3給註釋掉,僅僅留ata0。至於參數嗎,你自己看看吧,不常用,我後面說。
       第四個參數:ATA[0-3]-MASTER,ATA[0-3]-SLAVE,這就有用了,指定硬盤或光盤的參數,並指明它是主盤還是從盤。標準的參數是 ata0-master: type=disk, mode=flat, path="30M.sample", cylinders=615, heads=6, spt=17,type參數只能是兩者,disk(硬盤),cdrom(光盤),mode這個參數鏡像類型,它僅僅是針對磁盤纔有效,有幾種,flat (一個文件的佈局)concat(多個文件的佈局)external(開發者指定的,通過C++的類BOCHS就是C++開發的)dll(開發者指定的,通過dll文件)vmware3(wmware3使用的硬盤鏡像)。還有幾個其它的不介紹;path是指定硬盤或是光盤鏡像的文件。Cylinders, Heads,Spt這幾個參數通過這名字就能知道了。注意,這通常來說也不算是太重要,但是某些時候,則是特別重要,比如以前我裝minix1.5的時候,用bximage這個bochs自帶的創建磁盤工具創建了個硬盤,然後就指明路徑就運行,結果分區的時候一直出錯,查了半天才發現這幾個參數沒有設置好,bximage創建的硬盤的Heads和Spt似乎是固定的,和模板自帶的不一樣,結構分區的時候,自然按配置文件裏的計算,和實際的自然不符。
       知道這3個參數(除了第三個),基本上就能應付大多數的了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章