2014年7月24日 星期四

bochs 2.5.1/bochs 2.6 編譯/指令介紹

the 1st edition: 2012/02/11
the 2nd edition: 2013/02/05
the 3rd edition: 2014/07/24

從 source code 編譯 bochs 2.5.1/bochs 2.6.6/bochs 2.6.8, 通常我會需要以下這兩種版本的除錯方式。

使用內建 debugger

因為需要內建 debug 的功能, 所以從 source code 編譯開始 (通常預先編譯好的版本都沒這功能)。這只能針對組合語言除錯。

download source code: http://jaist.dl.sourceforge.net/project/bochs/bochs/2.6.6/bochs-2.6.6.tar.gz

apt-get build-dep bochs 會安裝編譯 bochs 所需要的 library

apt-get build-dep bochs
apt-get install libreadline6-dev libsdl1.2-dev libwxgtk2.8-dev

預設會使用 intel syntax, 想要改 at&t 語法的話可以修改

bochs-2.6.8/disasm/disasm.h
1 class disassembler {
2 public:
3 -  disassembler(): offset_mode_hex(0), print_mem_datasize(1) { set_syntax_intel(); }
4 +  disassembler(): offset_mode_hex(0), print_mem_datasize(1) { set_syntax_att(); }
重新編譯有點麻煩, 請手動刪除 *.o, 不要用 make clean, 若是第一次編譯, 就沒這問題。 ./configure --enable-debugger --enable-debugger-gui --enable-iodebug --enable-readline --with-sdl --with-x11 --with-x --with-wx --enable-disasm --enable-smp make make install --enable-smp : 多 cpu 支援。


readline 建議加上, 你能想像 dos 沒有 doskey 或是 bash 沒有 history 的功能嗎?

我在 debian jessie x64 上遇到一些問題, 改用 gcc 4.6, g++ 4.6, 並拿掉 --with-wx

export CC=gcc-4.6
export CXX=g++-4.6
../bochs-2.6.6/configure --enable-debugger --enable-debugger-gui   --enable-iodebug --enable-readline --with-sdl --with-x11 --with-x --with-wx --enable-disasm

最後 link 還得手動把 -lpthread 加入 Makefile LIBS 變數, 才能編譯成功。

ls /usr/local/bin/ 就可以看到相關檔案:
bochs  bxcommit  bximage 

複製 /usr/local/share/doc/bochs/bochsrc-sample.txt 為自己的 bochs 設定值檔案 bb, 這很重要, 請不要使用舊版的設定, 可能無法正常啟動 bochs, 然後修改需要的設定值。

執行 bochs:
bochs -f bb

bochs 模擬的硬體:
http://bochs.sourceforge.net/doc/docbook/user/features.html

使用 GDB 來配合除錯

使用Bochs和GDB对内核进行源代码级调试 (連接已經失效): http://osfromscratch.org/articlescn/5-articlecn/16-bochsgdb

qemu + gdb 的版本: http://dc0d32.blogspot.tw/2010/03/debugging-kernel-with-qemu-and-gdb.html

這兩種 debug 方式不能並存, 所以得編譯兩種不同的版本。
support remote gdb:

./configure --prefix=/home/descent/bochs-2.5.1-gdb --enable-gdb-stub --enable-debugger-gui --enable-iodebug --enable-readline --with-sdl --with-x11 --with-x --with-wx --enable-disasm

這個方法好酷, 可以針對 c 語言除錯, 不用辛苦和組合語言拼鬥。

From write_os

bochs 執行時需要設定檔, 這個部份比較麻煩, 安裝目錄會有一個範例, 以我的例子是在
/home/descent/bochs-2.6.8-default-debug/share/doc/bochs/bochsrc-sample.txt
需要修改這個, 在使用 -f 載入這個設定檔。

/home/descent/bochs-2.6.8-default-debug/bin/bochs -f bochsrc-sample.txt

不同版本的設定檔可能無法使用, 若新版 bochs 無法使用舊版設定檔, 請從範例修改。

常用 command

有些命令似乎有改過, 和書中 (書上的版本比較舊) 提的有些不同

切換反組譯的組合語言程式碼是 at&t 還是 intel 語法。
u switch-mode

觀察記憶體指令
from 0x0007d20 開始 5 byte 以 16 進位顯示
x /5xb 0x0007d20
x /5xbm 0x0007d20 
r, sreg 分別秀出 register 的值
r
eax: 0x00001301 4865
ecx: 0x00090005 589829
edx: 0x000f0000 983040
ebx: 0x0000000c 12
esp: 0x0000ffff 65535
ebp: 0x00007c4c 31820
esi: 0x000e7c84 949380
edi: 0x00007c84 31876
eip: 0x00007c11
eflags 0x00000046: id vip vif ac vm rf nt IOPL=0 of df if tf sf ZF af PF cf

sreg
es:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
cs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ss:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ds:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
fs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
gs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ldtr:0x0000, dh=0x00008200, dl=0x0000ffff, valid=1
tr:0x0000, dh=0x00008b00, dl=0x0000ffff, valid=1
gdtr:base=0x000fbb67, limit=0x30
idtr:base=0x00000000, limit=0x3ff

bochs 2.4.5 設定 (linux)

the 1st edition: 20111007

bochs 2.4.5 已經過時, 這只是紀錄用。

binary 安裝方式:
2.4.5 bochs 的設定檔和之前不同, 從 /etc/bochs-init/bochsrc 修改比較沒問題,

這幾個 ui 相關 library 最好也要安裝, 免得有什麼奇怪的錯誤訊息。
apt-get install bochs-wx bochs-x bochs-sdl

可能和這一行有關, sdl 大概需要安裝 sdl 的 library, wx, x 可能是 wx, x lib。
display_library: sdl

有出現 ROM: System BIOS must end at 0xfffff
修改 romimage

#romimage: file=/usr/share/bochs/BIOS-bochs-latest, address=0xf0000
romimage: file=/usr/share/bochs/BIOS-bochs-latest

config_interface: textconfig
#romimage: file=/usr/share/bochs/BIOS-bochs-latest, address=0xf0000
romimage: file=/usr/share/bochs/BIOS-bochs-latest
megs: 32
vgaromimage: file=/usr/share/vgabios/vgabios.bin
floppya: 1_44=freedos.img, status=inserted
floppyb: 1_44=pm.img, status=inserted

boot: a

mouse: enabled=0

hd image 的製作方式:
http://bochs.sourceforge.net/doc/docbook/user/howto.html

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。