oslab oranges 一個操作系統的實現 實驗一


實驗目的:

搭建基本實驗環境,熟悉基本開發與調試工具

對應章節:第一、二章

 

實驗內容:

1.認真閱讀章節資料

2.在實驗機上安裝virtualbox,並安裝ubuntu

3.安裝ubuntu開發環境,32位環境

4.下載bochs源碼,編譯並安裝bochs環境

5.使用bochs自帶工具bximage創建虛擬軟驅

6.閱讀、編譯boot.asm,並反匯編閱讀

7.修改bochsrc,運行並調試你的第一個程序:

刪除AA55,觀察程序效果,找出原因

修改程序中輸出為,一個任意長度的打印字符串,調試程序

把生成的可執行文件反匯編,並設置斷點進行調試,打印過程

回答:為什么要對段寄存器進行賦值

回答:如何在該程序中調用系統中斷

 

實驗環境:

VMwareWorkstationPro 15.5.0

Ubuntu 12.04.5 desktop i386 32位

bochs 2.6.9

 

關鍵技術:

Bochs的使用,主要在於反匯編與單步調試

匯編代碼的理解

Makefile的使用

 

實驗步驟:

1.在實驗機上安裝virtualbox,並安裝ubuntu開發環境,32位環境

 

在官網下載VMware Workstation Pro 15.5.0並安裝

在http://mirrors.163.com/ubuntu-releases/,下載:32位Ubuntu,12.04LTS

之后在VMware Workstation Pro中利用ubuntu iso文件安裝虛擬機

並安裝vmwaretools工具

結果如圖:

 

 

 

 

 

 

 

 2.下載bochs源碼,編譯並安裝bochs環境

1)首先Bochs下載:bochs 2.6.9

http://bochs.sourceforge.net/getcurrent.html

下載完畢后復制到ubuntu

(2)安裝必要環境

先修改ubuntu源

修改ubuntu源方法:

 

http://mirrors.163.com/.help/ubuntu.html

deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse 
deb-src http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
deb http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted

 

之后安裝必要環境

 sudo apt-get install g++

sudo apt-get install build-essential

Sudo apt-get install libgtk2.0-dev

Sudo apt-get install bison

Sudo apt-get install libx11-dev

libxrandr-dev

libsdl1.2-dev

vgabios

/*bximage*/

 

3)之后安裝bochs

 

$tar vxzf bochs-2.6.9.tar.gz

 

$cd bochs-2.6.9

 

$./configure --enable-debugger --with-sdl --enable-disasm  --enable-readline LIBS='-lX11'    

 

$make

 

$sudo make  install

 

 

輸入命令bochs

如下圖,說明安裝成功

 

 

 3.使用bochs自帶工具bximage創建虛擬軟驅

控制台輸入bximage即可

 

 

注意創建的a.img位於Home

 

 4.閱讀、編譯boot.asm,並反匯編閱讀

(1)閱讀boot.asm

 

 

Boot.asm相當於寫了一個引導程序

CPU通過CS:IP寄存器中的內容找到要執行的代碼片段所在的實際物理內存地址

Mov ax ,cs

Mov ds ,ax

Mov es,ax

相當於給定代碼段和數據段,和附加段基地址。

之后DispStr調用10h 13號中斷展示BootMessage字符串,規定的展示位置,字體顏色等等。

之后BootMessage db “...”定義了字符串

Times 510 -($-$$) db 0 計算需要多少字節0才能填充剩余0,使得從開頭到當前,再加填充的0構成510字節

最后dw 0Xaa55 定義最后兩字節為aa55。共512字節,最后兩字節為aa55,固為引導程序。

 

 

org  規定程序起始地址為07c00h

cs 代碼段寄存器

ds 數據段寄存器

es 附加段寄存器

bp 基址

ES 段地址 BP偏移地址

 

cxaxbx 數據寄存器

ah ax8位,al ax8

dl dx 8

db 定義字節變量

Int interrupt

 

dw定義字類型變量

mov ab b值賦給a

Jmp $ 表示死循環

$表示當前地址,表示當前行被匯編后的地址

$$表示節的開始處被匯編后的地址

 

引導程序
BIOS將所檢查啟動磁盤的第一個扇區512字節載入內存,放於內存0x0000:0x07c00處。
如果第一扇區最后兩個字節是AA55,那么它就是一個引導程序。

引導程序特點
大小是512字節,不能多也不能少,因為BIOS只讀取512B到內存中。
它結尾必須是55AA,這是引導扇區標志。
它總是放在磁盤第一個扇區上(0磁頭0此道1扇區)因為BIOS只讀取第一個扇區。

 

Int 10h

10H中斷的13號中斷用於顯示字符串,參數為:

 

AH13H

 

AL=顯示方式

 

BH表示視頻區頁數

 

如果ALBIT10,則BL表示顯示屬性。

 

CX為字符串長度

 

DH表示在第幾行顯示(0為第一行)

 

DL表示在第幾列顯示(0為第一列)

 

ESBP指向字符串

 

 

(2)編譯boot.asm

nasm boot.asm -o boot.bin

 

 5.修改bochsrc,運行並調試你的第一個程序:

(1)修改bochsrc

修改vgaromimage和romomage對應的文件位置,注意是bochs安裝后的位置,而不是tar解壓的bochs文件夾中的文件

注釋掉keyboard_mapping一行

增加display_library: sdl

 

 

修改后相當於規定了啟動軟盤為a.img

 

 

(2)Makefile

先看Makefile文件

 

 

意為:先解壓a.img.gz,然后匯編編譯boot.asm,然后用boot.asm填充a.img,然后運行bochs

 

Clean rm -f 為刪除文件

 

./configure 是用來檢測你的安裝平台的目標特征的。比如它會檢測你是不是有CCGCC,並不是需要CCGCC,它是個shell腳本。

make 是用來編譯的,它從Makefile中讀取指令,然后編譯。

make install是用來安裝的,它也從Makefile中讀取指令,安裝到指定的位置。

 

Bochs從當前目錄尋找bochsrc作為配置文件

 

(3)運行

Cd 到目標文件夾

Make

就先后完成解壓,編譯,打開了bochs

 

 

然后輸入6開始simulation

記得要輸入c continue

 

 

 

 

 

 

(4)調試刪除AA55,查看效果

修改后的boot.asm

 

 

Nasm編譯為b2.bin

Bximage 創建新的floppy disk a.img

寫入

Bochs運行

 

 

發現效果為:無法運行,直接退出

 

原因:因為位於1扇區的512字節,且最后字節為aa55的程序為引導程序,a.img作為引導盤,aa55為標志,刪除后相當於沒有引導程序,故無法運行直接退出

 

(5)修改輸出字符串

只需要根據想要輸出的字符串修改BootMessage,根據BootMessage的長度修改cx即可

舉例,輸出just monika

修改后的asm

 

 

運行效果

 

 

(6)把生成的可執行文件反匯編,並設置斷點進行調試,打印過程

nasm,ndisam可以反匯編

bochs也可以反匯編,並實現單步調試

具體指令參考教材第二章,或輸入 help查看命令

就對寫入了原始boot.asm編譯產生的boot.bin的a.img用bochs調試

 

 

b 0x7a00 設置斷點

C 運行到斷點

Info cpu查看cpu寄存器

 

 

 

 

x /64xb 0x7c00 查看內存  64sequence長度,x16進制顯示,b為長度為byte

 

Help x 可以具體查看參數意義。

 

 

 

n 單步運行 (遇到函數會跳過)

 

 

trace-reg on bochs每一步都顯示主要寄存器的值

 

U 為反匯編 disasm

 

 

 

 

 

可見在調用DispStr函數后,程序一直循環

 

 

 

6. 回答相關問題

1)回答:為什么要對段寄存器進行賦值

cs為代碼段基址,賦給ds,es,確定程序運行的基址,比如數據段基址,之后加上bp,ES:BP就構成了BootMessage的地址

2)回答:如何在該程序中調用系統中斷

使用匯編int 10h 調用中斷,同時設置好其參數,比如cx為字符串長度,ah=13表示輸出字符串,AL=01h為顯示器模式,bx 000c為顏色,dl 0 表示在第一行輸出,ES:BP存儲字符串地址

 

遇到的問題及解決:

1.報錯

 

 

 可以考慮在執行configure時添加參數LIBS='-lX11'

./configure --enable-debugger --enable-disasm --enable-readline LIBS='-lX11'    

 

2.報錯make: *** [Makefile:429: install_bin] Error 1

解決 加上sudo權限即可

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM