Bochs虛擬機 & 編寫主引導扇區程序並執行

bochs虛擬機是一個帶調試器的虛擬機

Bochs是一種十分輕便的使用c++編寫的開源IA-32(x86)電腦模擬器

現實中專業的調試器又很多,但是它們只能調試那些符合操作系統要求的程序,而不能調試只包含處理器指令的程序

 

bin文件操作系統不能執行,但是處理器可以直接執行
bin文件包含的都是機器指令

 

 

 

創建一個固定尺寸的VHD虛擬硬盤並安裝在Bochs虛擬機上

使用virtualbox創建VHD虛擬硬盤

 

得到創建VHD虛擬磁盤的柱面數、磁頭數和每道扇區數

fixvhdwr.exe

可以看到有602個柱面,4個磁頭,每道17個扇區

注意這個fixvhdwr.exe只能打開virtualbox創建的VHD虛擬磁盤文件,其他軟件創建的都打不開

 

打開bochs,配置Learn.vhd硬盤

此時,虛擬硬盤裏面還是什麼內容也沒有

 

創建主引導扇區

exam.asm

mov ax,0x30
mov dx,0xC0
add ax,dx

使用nasm編譯成exam.bin

用十六進制打開

8個字節

如何保證主引導扇區是有效的呢

      如果主引導扇區是無效的,上面並非是一些我們有意寫的東西,而處理器又不加鑑別地執行了它,其結果是導致處理器的執行出現異常。爲此,計算機的設計者們決定,一個有效的主引導扇區,其最後兩個字節的數據必須是十六進制的55,AA

 

並且,我們需要在exam.asm基礎上,再添加一些東西來湊夠512個字節

mov ax,0x30
mov dx,0xC0
add ax,dx

times 502 db 0 ;重複僞指令db 0 502次
db 0x55
db 0xAA

db是僞指令,向程序中添加一個字節的數據

僞指令就是不是真正的處理器指令
它是讓編譯器做事而不是讓處理器做事

times是nasm編譯器的指令
 

這樣就生成了一個合法的主引導扇區程序

 

將程序寫入硬盤主引導扇區

主引導扇區是0面0道1扇區

使用fixvhdwr.exe, 打開Learn.vhd

 

LBA邏輯塊地址

傳統上,爲了讀寫硬盤,我們必須指定柱面號(磁道號)、磁頭號和扇區號

採用磁道(Cylinder)、磁頭(Header)和扇區(Sector)這樣的模式來訪問硬盤的方法叫做CHS模式

每次讀寫硬盤都要考慮這三個,很麻煩。如果我們將硬盤的所有扇區統一編號,讀寫時只需要這一個編號,這樣就很方便

於是就引入了邏輯塊地址(LBA, Logical Block Address)的概念

現在市場上銷售的硬盤,無論是哪個廠家生產的,都支持LBA模式

LBA模式是由硬盤控制器在硬件一級上提供支持,效率很高,兼容性很好

 

用調試器觀察程序的運行

bochs.exe啓動後是作爲一個普通的虛擬機來運行,沒有調試功能

bochsdbg.exe啓動後是作爲一個帶有調試器的虛擬機,可以利用它做調試工作

 

下面啓動bochsdbg.exe

直接點擊start

右邊是虛擬機的顯示器,左邊是調試窗口

 

boches虛擬機在加電時候就會開始取指令和執行指令

但是與真正的虛擬機不同,bochs在取第一條指令之前會先停下來,等待你的第一條命令,光標上面顯示的就是下一條即將執行的指令

[0x0000fffffff0]是這條指令所在的物理內存地址

f000:fff0 可以理解爲這條指令的邏輯內存地址,但實際上是段寄存器cs和指令指針寄存器IP在此時此刻的內容

這和8086是不一樣的,8086啓動時,CS內容是ffff,IP是0

jmpf 0xf000:e05b是這條指令的彙編語言形式

最後的ea5be000f0是這條指令的機器碼,處理器代碼

 

sreg顯示段寄存器

r顯示通用寄存器

 

AX是16位的

EAX是32位的,AX依然可以使用

RAX是64位的,EAX依然可以使用

 

BX,CX,DX也都是這樣

 

 

s 單步執行

b 設置斷點(實現設置一個內存地址,當處理器執行到這個內存地址時就會自動停下來)

c 繼續執行

q退出

 

計算機在啓動後總是把主引導程序加載到物理內存地址7C00處

所以給0x7C00設置斷點

再輸入c,繼續執行

此時程序出現了問題,顯示沒有可以啓動的設備

點kill simulation就是取消本次調試

 

再次打開bochsdbg.exe

重新設置硬盤

將配置保存起來,不是隻對本次啓動有效

重新啓動

設置斷點,continue

可以看到已經執行了17404836條指令,真滴好多鴨

下一條要執行的指令就是mov ax, 0x0030

就是我們編寫的第一句了

之後我們就可以用s和r,單步執行和查看寄存器了

但是一旦執行3條命令之後全是0的命令就不能執行了,否則會出錯的

之後按q退出

 

 

 

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