當電腦電源被開啟後,它會先進行加電自檢(POST),然後尋找啟動盤,如果是選擇從磁碟片啟動,電腦就會尋找磁碟片的0面0磁軌1扇區,如果發現它以0xAA55結束,則BIOS認為它是一個開機磁區,然後BIOS就會把開機磁區的前512位元組的引導代碼拷貝到記憶體的0000:7c00處並將控制器徹底交給這段引導代碼。
簡單的引導代碼如下所示:
複製代碼 代碼如下:org 07c00h ;告訴編譯器載入到07c00h處
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ;調用顯示字串函數
jmp $; 無限迴圈
DispStr:
mov ax, BootMessge
mov bp, ax
mov cx, 16
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMessge: db "hello, OS world!"
times 510 - ($ - $$) db 0
dw 0aa55h
這段代碼時用nasm寫的,它類似於masm的語言。org 07c00h命令就是將命令後面的代碼中的位移地址都加上07c00h,這樣程式就相當於在0000:7c00出執行了。按書中所講的,用命令nasm bootsector.asm -o boot.bin產生引導代碼boot.bin,然後將boot.bin寫入磁碟片的0面0磁軌1扇區就可以了。問題就來了,我沒有磁碟片怎麼搞,不過在wmware虛擬機器中貌似可以用磁碟片的映像檔案來啟動,所以就想到自己製作一個映像檔案來代替磁碟片來作為啟動盤,不過怎麼建立這個映像檔案呢?
以前記得用linux下的dd命令做過linux的啟動盤,dd應該是可以製作的,於是在網上找了下dd製作映像檔案,果然是可以的,製作方法如下:
1 先製作一個空的磁碟片映像檔案diska.img(1.44Mb的磁碟片映像檔案):
dd if=/dev/zero of=diska.img bs=512 count=2880
2 製作一個包含boot.bin的映像檔案boot.img:
dd if=boot.bin of=boot.img bs=512 count=1
3 將diska.img中1個扇區後面的資料拷貝到boot.img的後面
dd if=diska.img of=boot.img skip=1 seek=1 bs=512 count=2879
這樣就做成了一個大小為1.44Mb的包含引導代碼的映像檔案。
後面的事就好辦了,直接在wmware建立一個空的虛擬機器,在設定中將Floppy的路徑設定為上面製作的開機磁區的路徑就ok了,如那樣:
設定Floppy串連,斷開CD/DVD串連,啟動虛擬機器就可以看到下面的畫面了:
總結:這個小的代碼的編寫和運行還是能讓自己對系統啟動有一個更深的認識,不過有個不懂的就是怎麼用ISO鏡像檔案啟動,怎麼將引導代碼寫入ISO鏡像檔案,依然沒有找到很好的方法解決。