寫一個PC機的引導程序比我們想象的容易很多,事實上所需要了解的只是知道PC機是怎樣啟動的。在網上看到不少類似的文章,說的很多,有的很麻煩,筆者覺得僅僅是寫一個引導程序完全沒有必要牽涉太多東西,知道足夠的知識用于去實際地寫一個出來看看是很多人最初的目的,那這篇文章就剛好適合你了。這篇文章的立足點就是短、簡單、一看就懂,而又不會看完了什么都不知道就寫出一個連自己都看不懂的代碼。
另外,機器人天空重新改版,筆者興奮的看到了一個真正的機器人網站,囊括了機器人科學與技術這樣龐大的系統工程的各個方面,在此獻上這篇文章給機器人天空的操作系統專欄,祝愿機器人天空越辦越好,并能夠為中國的機器人愛好者們帶來更多更豐富的信息與資源,做更多的實事!同時,也希望廣大的機器人愛好者和有識之士都能出一份力,為祖國更美好的明天共同努力!筆者與您共勉。
現在,讓我們開始引導程序初探!
[什么?]
很多文章中把寫一個引導程序稱作是開發一個最簡單的操作系統,其實這是非常片面的,引導程序算不上操作系統,雖然此程序可以運行在裸機上。所謂引導程序,直觀的說就是在系統加電啟動時BIOS第一個執行的程序。
引導程序要想發揮作用,讓機器識別,就必須安置在一個特別的位置,這個位置就是磁盤的第一個扇區(0面0磁道1扇區,備注:沒有0扇區),而一個包含引導程序的扇區叫作引導扇區。
一個合法的引導扇區(1)通常包含512個字節(當然嘍,一個扇區通常本來就是512個字節),(2)并且以0xAA55這樣一個占用兩個字節的數據結尾作為標志符。(備注:0x前綴說明這是一個十六進制數)。
也就是如果把引導扇區看成一個字符數組的BootSector[]話(因為一個字符,即char,剛好為一個字節),那么這個數組就擁有512個元素,如果用C語言申明的話即為
char BootSector[512];
接著,一個合法的引導扇區必須以0xAA55結束,即
BootSector[510] = 0x55;
BootSector[511] = 0xAA;
除了結束標志必須符合上面的要求之外,中間雖然還有510字節的空間,但執行代碼可以少于510字節,用無意義字符(通常用0x0)填充剩余空間即可。
[過程]
PC是通過BIOS來啟動機器的,當PC機加電之后BIOS啟動相應的程序完成機器的自檢,然后就尋找可以引導的驅動器,即大家通常所說的啟動盤。在 BIOS中可以設置從哪個盤啟動,但通常總要檢查硬盤,所以當BIOS檢查完前面的啟動設備之后,如果沒有發現任何引導程序,那么就會開始檢查主硬盤,即 C盤。如果此時在C盤上找到了合法的引導扇區,那么就會將引導扇區的內容(共512字節)裝載到內存0x0000:07C00處。此時BIOS把控制權限交給這段引導程序。
那么,接下來,引導程序通常會簡單的執行一些指令,比如輸出一段文字,顯示一個啟動界面等等,但最重要的,引導程序將會啟動一個更大的程序,然后把權限交給他,這通常就是我們所說的操作系統內核。額外補充一句,目前對操作系統的定義有不少,但筆者比較贊成的觀點如下:
從形式上看,操作系統是:從計算機啟動到結束的過程中始終在運行的程序。而這通常就是我們所說的操作系統內核。從功能上看,操作系統:管理和維護所有的硬件、軟件、數據資源,并為上層應用或服務提供一個抽象的接口。從某種層面上看,第二中定義更接近于虛擬機。(閑話一段^_^)
[如何]
現在,已經了解了這些基本的概念,那么,如何動手制作這樣的引導扇區呢?這個過程十分簡單,
?。?)首先按照要求寫一個合法的引導程序(通常用匯編,機器碼也可以,呵呵);
(2)然后將其通過匯編程序,如NASM匯編成二進制文件;
?。?)最后,將這個二進制文件寫入到目標盤的第一個扇區。
跟我做:-P]
上面說的很簡單吧?那好,現在我們來寫一個吧!
第一步:寫代碼
; 文件名:boot.asm
; 代碼如下,注意,匯編中通常用“;”來表示注釋內容
; 此段代碼參考《自己動手寫操作系統》(于淵)
;
; 初始化函數
org 07c00h ; 告訴編譯器將此段程序加載
; 到內存0x0000:07C00處
mov ax, cs
mov ds, ax
mov es, ax
call PrintStr ; 調用屏幕打印函數
jmp $ ; 無限循環
PrintStr: ; 屏幕打印函數
mov ax, HelloWorld ; 將字符串拷貝到ax
mov bp, ax ; es:bp = 串地址
mov cx, 24 ; cx = 串長度
mov ax, 01301h ; ah = 13, al = 01h
mov bx, 000ch ; 頁號為0(bh = 0) 黑底紅字(bl = 0ch,高亮)
mov dl, 0
int 10h ; 10h號中斷
ret
HelloWorld: db "Welcome to Lee's OS *_*" ; 字符串負值
times 510-($-$$) db 0 ; 用0x0填充剩余的空間使生成
; 的二進制代碼剛好為512字節
dw 0xaa55 ; 結束標志
; 整個程序結束!很短吧
第二步:匯編
假設你已經安裝了NASM程序,那么進入命令行模式,然后輸入以下命令:
C:[PATH]/ nasm boot.asm -o boot.bin
其中“C:[PATH]/”為boot.asm代碼文件所在位置。
現在如果不出意外的話,你已經擁有了boot.bin二進制文件,這個就是引導程序!
第三步:制作引導盤
由于不能隨便更改硬盤,否則系統無法進入原來的操作系統,所以我們用軟盤來試驗。
那么,我們準備一張軟盤。
現在,我們要自己寫一個程序將我們匯編得到的二進制文件寫到軟盤的第一個扇區。
C語言程序代碼如下:
/***************START***************/
#include
#include
int main(void)
{
FILE *in;
unsigned char buffer[520];
if((in = fopen("boot.bin", "rb"))==NULL)
{
printf("Error loading file/n");
exit(0);
}
fread(&buffer, 512, 1, in);
while(biosdisk(3, 0, 0, 0, 1, 1, buffer));
fclose(in);
return 0;
}
/****************END****************/
注意,這個程序必須同boot.bin文件在同一目錄下,然后將軟盤放進軟驅,運行此程序。
第四步:GOGOGO
好了,現在你擁有了一張從頭到尾完全自制的引導盤,由于有了她,你想運行你的電腦再也不需要微軟插手了,而且這很可能是你第一次能在裸機上運行一個自己的程序哦,哈哈!
重新啟動你的機器,記得把軟盤放進去,現在你看見什么了?
一行醒目的紅字:
Welcome to Lee's OS *_*
打印在屏幕上!
寫在后面
本文完整的講述了編寫引導程序的過程,其中肯定會有一些不足,歡迎指正。另外,對于有各種其他想法,如希望在虛擬PC上嘗試的人,那么只需要查找相應方法就可以。這是本文的第一個版本,如果有必要,后面還可能繼續更新:-)
新聞熱點
疑難解答