?? helloworldos.txt
字號:
自己動手寫操作系統--"Hello, OS world!"
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個參數(除了第三個),基本上就能應付大多數的了。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -