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退出
Bochs虛擬機 & 編寫主引導扇區程序並執行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.