home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

Assembler/ForFun(x86_32)/03, x86_32用 デバッグ機能有効化 Bochs をVC++2008でビルド

Assembler/ForFun(x86_32)/03, x86_32用 デバッグ機能有効化 Bochs をVC++2008でビルド

Assembler / ForFun(x86_32) / 03, x86_32用 デバッグ機能有効化 Bochs をVC++2008でビルド
id: 784 所有者: msakamoto-sf    作成日: 2010-09-16 15:15:05
カテゴリ: Assembler 

MBR以降のブートローダ周りのアセンブラプログラミングを楽しむのであれば、Windows/Linuxで動作するx86エミュレータ "Bochs" が便利です。Windows用のインストーラEXEをHPからダウンロード出来ます。
コンパイル時にデバッグ機能を有効化すると、BIOSが立ち上がる段階からステップ実行やレジスタ内容の確認が出来ます。Windows用のインストーラでセットアップするとデバッグ機能が有効化された"bochsdbg.exe"も同時にインストールされるので、わざわざコンパイルする必要もありません。

ところが、2010年9月時点での最新版、2.4.5のWindowsバイナリはx86_64をエミュレートするようコンパイルされています("--enable-x86-64"有効)。
x86の16bitや32bitの世界をBochsのデバッグ機能で楽しみたい場合は、"--enable-x86-64"を無効にして("--disable-x86-64")コンパイルする必要があります。
Linux/UNIX環境であればソースを展開して "./configure" で次のオプションを指定すればOKです。

--disable-x86-64
--enable-debugger
--enable-disasm

本記事では Windows 環境の場合にBochs-2.4.5で上記オプションでビルドする手順を紹介します。
コンパイラは Visual C++ 2008 Express Edition SP1 を使います。Cygwin/MinGWのgccによるコンパイルは本記事では扱いません。



ツールの準備

  • Visual C++ 2008 Express Edition SP1 : コンパイラ・リンカとして使います。Microsoftのサイトからダウンロード出来ます。
  • MSYS + MinGW : "./configure"スクリプトを走らせる為のUNIX環境です。ネット上で検索して適宜インストールして下さい。

"./configure"スクリプトを走らせるのであればCygwin環境でもOKと思われます。とりあえず本記事ではMSYS + MinGW環境で"./configure"を実行します。

ソースの準備と日本語キーボード用patchの適用

  • bochs-2.4.5.tar.gz : Bochsのサイトからダウンロード出来ます。
  • がじぇっとぼっくす

1. 本家のtarボールを展開します。

例:c:\work\bochs-2.4.5\
                        README
                        Makefile.in
                        ...

2. "がじぇっとぼっくす"からダウンロードしたzipを展開し、"patch"フォルダ中のpatchファイルを本家tarを展開した"bochs-2.4.5"と同じディレクトリに置きます。

例:c:\work\
            bochs-2.4.5-dbgfix-20100430.diff
            bochs-2.4.5-jpfix-20100430.diff
            bochs-2.4.5\
                        README
                        Makefile.in
                        ...

3. MSYSコンソールを開いて、patchを適用します。

例:
$ cd /c/work

$ patch --dry-run -p0 -b  < bochs-2.4.5-dbgfix-20100430.diff
(エラーや気になるメッセージが無ければ "--dry-run" を外す)
$ patch -p0 -b  < bochs-2.4.5-dbgfix-20100430.diff

$ patch --dry-run -p0 -b  < bochs-2.4.5-jpfix-20100430.diff
(エラーや気になるメッセージが無ければ "--dry-run" を外す)
$ patch -p0 -b  < bochs-2.4.5-jpfix-20100430.diff

"./configure"とビルド

1. "bochs-2.4.5/.conf.win32-vcpp" の "./configure" オプションを以下のように修正します。

use_debugger="enable"
use_a20="enable"

./configure --target=pentium-windows \
 --enable-cpu-level=6 \
 --disable-shared \
 --disable-acpi \
 --disable-x86-64 \
 --disable-vmx \
 --disable-smp \
 --disable-3dnow \
 --disable-monitor-mwait \
 --disable-gameport \
 --disable-sb16 \
 --disable-usb \
 --enable-alignment-check \
 --enable-all-optimizations \
 --enable-pci \
 --enable-vbe \
 --enable-clgd54xx \
 --enable-cdrom \
 --enable-ne2000 \
 --enable-configurable-msrs \
 --$use_a20-a20-pin \
 --$use_debugger-x86-debugger \
 --$use_debugger-debugger \
 --$use_debugger-disasm \
 --$use_debugger-debugger-gui \
 --enable-iodebug \
 --enable-show-ips \
 --with-win32 \
 --with-rfb \
 --with-nogui

オプションなどはお好みに応じて調整して下さい。但し次のオプションは必須なので省略しないで下さい。

use_debugger="enable"
use_a20="enable"
...
--target=pentium-windows      # VC++用
--disable-x86-64              # x86_64無効化
--$use_a20-a20-pin            # A20pin有効
--$use_debugger-x86-debugger  # 以降、デバッグ機能有効
--$use_debugger-debugger
--$use_debugger-disasm
--$use_debugger-debugger-gui

2. MSYSコンソールで "bochs-2.4.5" のディレクトリにcdし、"sh .conf.win32-vcpp" を実行します。

$ cd /c/work/bochs-2.4.5
$ sh .conf.win32-vcpp

3. "Visual Studio 2008 コマンドプロンプト"を開き "bochs-2.4.5" にcdし、nmakeを実行します。

> cd C:\work\bochs-2.4.5
> nmake

NOTICE: "Visual Studio 2008 コマンドプロンプト" でなくとも、vcvars32.batなどで環境変数を調整したコマンドプロンプト上であればOKです。

インストール

ビルドに成功すれば、"bochs-2.4.5"ディレクトリ上に以下のEXEが生成されます。

bochs.exe     ... Bochs本体
bxcommit.exe  ... flat HDD イメージファイルにredologを書き出すツール
bximage.exe   ... Bochs用のFD/HDDイメージファイル作成ツール
niclist.exe   ... NICインターフェイスのリストアップ

bochs.exeを実行するには、仮想マシンの設定ファイル "bochsrc" やBIOS/VGABIOSファイルが必要です。

ここでちょっと手抜きをして、Bochsの実行用ディレクトリツリー一式を、本家からコピーしてしまいます。

1. 本家のWindows用インストーラを使ってセットアップします。
2. ビルドしたEXEで本家のEXEを上書きコピーします。

必要に応じて、上書きコピーする前に本家のEXEファイルをバックアップして下さい。

以上でdebug機能有効+x86_32モードでのBochsでアセンブラプログラミングを楽しめるようになります。

なお「USBメモリで持ち運べるようにしたい」等の理由でインストールディレクトリをコピー+本家の方はアンインストールしてしまう場合、BXSHARE環境変数を手動で設定する必要があるので注意して下さい。また、BXSHARE環境変数ではディレクトリセパレータを"/"で表記する必要があります。

ex:
> set PATH=C:\work\bin\Bochs-2.4.5;%PATH%
> set BXSHARE=C:/work/bin/Bochs-2.4.5

動作確認

とりあえずBIOSが起動することを確認してみます。
以下のような".bxrc"ファイルを用意します。

test.bxrc:

romimage: file=$BXSHARE/BIOS-bochs-latest 
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
megs: 16
floppya: 1_44=foobar, status=inserted
boot: floppy

"floppya"で指定した"foobar"というイメージファイルは存在しませんので、BIOSブート後にエラーとなります。
とりあえずBochsがデバッグ機能有効で起動することを確認出来ればよいので、このまま"test.bxrc"ファイルを指定してBochsを起動します。

> bochs -q -f test.bxrc
========================================================================
                       Bochs x86 Emulator 2.4.5
              Build from CVS snapshot, on April 25, 2010
========================================================================
00000000000i[     ] reading configuration from test.bxrc
00000000000i[     ] installing win32 module as the Bochs GUI
00000000000i[     ] Bochs x86 Emulator 2.4.5
00000000000i[     ]   Build from CVS snapshot, on April 25, 2010
00000000000i[     ] System configuration
00000000000i[     ]   processors: 1 (cores=1, HT threads=1)
00000000000i[     ]   A20 line support: yes
00000000000i[     ] CPU configuration
00000000000i[     ]   level: 6
(...)
00000000000i[     ] set SIGINT handler to bx_debug_ctrlc_handler
Next at t=0
(0) context not implemented because BX_HAVE_MAP=0
[0xfffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b         ; ea5be000f0
<bochs:1>

ここでデバッグ用のコマンドプロンプトが表示され、デバッグコマンドの入力待ちとなります。
試しにレジスタ群を表示させる"r"コマンドを実行してみます。

<bochs:1> r
eax: 0x00000000 0
ecx: 0x00000000 0
edx: 0x00000f00 3840
ebx: 0x00000000 0
esp: 0x00000000 0
ebp: 0x00000000 0
esi: 0x00000000 0
edi: 0x00000000 0
eip: 0x0000fff0
eflags 0x00000002: id vip vif ac vm rf nt IOPL=0 of df if tf sf zf af pf cf

EAX, EBX, ... とx86_32でお馴染みのレジスタ群が表示されました。本家バイナリなど"--enable-x86-64"でコンパイルされると、"RAX, RBX, ..."というふうにx86_64で拡張されたレジスタ群が表示されます。

続行するには"c"コマンドを実行します。その他のデバッグコマンドは"help"コマンドで調べることができます。

<bochs:2> c
00000003305i[BIOS ] $Revision: 1.247 $ $Date: 2010/04/04 19:33:50 $
00000200000i[WGUI ] dimension update x=720 y=400 fontheight=16 fontwidth=9 bpp=8
00000318042i[KBD  ] reset-disable command received
00000444800i[VBIOS] VGABios $Id: vgabios.c,v 1.69 2009/04/07 18:18:20 vruppert Exp $
00000444871i[CLVGA] VBE known Display Interface b0c0
00000444903i[CLVGA] VBE known Display Interface b0c5
00000447828i[VBIOS] VBE Bios $Id: vbe.c,v 1.62 2009/01/25 15:46:25 vruppert Exp $
00000760517i[BIOS ] Starting rombios32
00000761014i[BIOS ] Shutdown flag 0
00000761697i[BIOS ] ram_size=0x01000000
00000762175i[BIOS ] ram_end=16MB
...
00013554880i[FDD  ] attempt to read/write sector 1 with media not present
00021536598i[FDD  ] controller reset in software
00021591573p[BIOS ] >>PANIC<< No bootable device.

ここで表示が止まります。
Bochsのウインドウを見てみると、"PANIC"ダイアログが表示されますので、"Kill simulation"を選択して"OK"をクリックして終了します。

========================================================================
Bochs is exiting with the following message:
[BIOS ] No bootable device.
========================================================================
00021591573i[CPU0 ] CPU is in real mode (active)
00021591573i[CPU0 ] CS.d_b = 16 bit
00021591573i[CPU0 ] SS.d_b = 16 bit
00021591573i[CPU0 ] | EAX=0000040a  EBX=0000cd04  ECX=00000004  EDX=00000402
00021591573i[CPU0 ] | ESP=0000ffa8  EBP=0000ffac  ESI=000e32f8  EDI=0000ffac
00021591573i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf ZF af PF cf
00021591573i[CPU0 ] | SEG selector     base    limit G D
00021591573i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00021591573i[CPU0 ] |  CS:f000( 0004| 0|  0) 000f0000 0000ffff 0 0
00021591573i[CPU0 ] |  DS:0000( 0005| 0|  0) 00000000 0000ffff 0 0
00021591573i[CPU0 ] |  SS:0000( 0005| 0|  0) 00000000 0000ffff 0 0
00021591573i[CPU0 ] |  ES:07c0( 0005| 0|  0) 00007c00 0000ffff 0 0
00021591573i[CPU0 ] |  FS:0000( 0005| 0|  0) 00000000 0000ffff 0 0
00021591573i[CPU0 ] |  GS:0000( 0005| 0|  0) 00000000 0000ffff 0 0
00021591573i[CPU0 ] | EIP=00000560 (0000055f)
00021591573i[CPU0 ] | CR0=0x60000010 CR2=0x00000000
00021591573i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
(0).[21591573] [0x000f055f] f000:055f (unk. ctxt): out dx, al                ; ee
00021591573i[CMOS ] Last time is 1284617497 (Thu Sep 16 15:11:37 2010)
# In bx_win32_gui_c::exit(void)!
00021591573i[CTRL ] quit_sim called with exit code 1

>

以上で、x86_32bit + デバッグ機能有効化されたBochsを動かせるようになりました。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2010-09-19 20:59:41
md5:dd0319ccd2a4c7c6158379720c13c9a9
sha1:594c75b4ec38aa67fa268b0cf672591bb0bb5910
コメント
コメントを投稿するにはログインして下さい。