nasm實現(xiàn)的用vmware運行自做的linux啟動盤的引導代碼
當計算機電源被打開后,它會先進行加電自檢(POST),然后尋找啟動盤,如果是選擇從軟盤啟動,計算機就會查找軟盤的0面0磁道1扇區(qū),如果發(fā)現(xiàn)它以0xAA55結(jié)束,則BIOS認為它是一個引導扇區(qū),然后BIOS就會把引導扇區(qū)的前512字節(jié)的引導代碼拷貝到內(nèi)存的0000:7c00處并將控制器徹底交給這段引導代碼。
簡單的引導代碼如下所示:
org 07c00h ;告訴編譯器加載到07c00h處
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ;調(diào)用顯示字符串函數(shù)
jmp $; 無限循環(huán)
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出執(zhí)行了。按書中所講的,用命令nasm bootsector.asm -o boot.bin生成引導代碼boot.bin,然后將boot.bin寫入軟盤的0面0磁道1扇區(qū)就可以了。問題就來了,我沒有軟盤怎么搞,不過在wmware虛擬機中貌似可以用軟盤的映像文件來啟動,所以就想到自己制作一個映像文件來代替軟盤來作為啟動盤,不過怎么創(chuàng)建這個映像文件呢?
以前記得用linux下的dd命令做過linux的啟動盤,dd應該是可以制作的,于是在網(wǎng)上找了下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個扇區(qū)后面的數(shù)據(jù)拷貝到boot.img的后面
dd if=diska.img of=boot.img skip=1 seek=1 bs=512 count=2879
這樣就做成了一個大小為1.44Mb的包含引導代碼的映像文件。
后面的事就好辦了,直接在wmware創(chuàng)建一個空的虛擬機,在設置中將Floppy的路徑設置為上面制作的引導扇區(qū)的路徑就ok了,如下圖那樣:
設置Floppy連接,斷開CD/DVD連接,啟動虛擬機就可以看到下面的畫面了:
總結(jié):這個小的代碼的編寫和運行還是能讓自己對系統(tǒng)啟動有一個更深的認識,不過有個不懂的就是怎么用ISO鏡像文件啟動,怎么將引導代碼寫入ISO鏡像文件,依然沒有找到很好的方法解決。
相關(guān)文章
Cordova插件實現(xiàn)JavaScript與Java的通信的詳細過程
本文將結(jié)合最常用的華為推送服務Cordova插件,介紹HMS Core用到的JS-Java消息交互方式,講解在JS側(cè)如何調(diào)用Java側(cè)接口,最終實現(xiàn)HMS Core能力,感興趣的朋友一起學習下吧2021-06-06