Bochsの使い方

# Bochs
http://bochs.sourceforge.net/
Bochsはx86のエミュレータで，初期の386プロセッサから市場に流通していないような最新のCPUまでを(:astonished:)エミュレートすることができます．
Intelの中の人がメンテナンスをしているようです．
現在でも頻繁に更新されていて，[help](https://sourceforge.net/p/bochs/discussion/39592/)に質問を投げると割とすぐ返してくれたりしました．

# 使い方  
## 手順  
### Bochs本体のインストール  
最新版は[このページ](https://sourceforge.net/projects/bochs/files/bochs/)
[このページ](http://bochs.sourceforge.net/getcurrent.html)の最後にSVNスナップショットも乗っていました．  
コンフィグのオプションとして， 

```
./configure --enable-vmx=2 \\
            --enable-x86-64 \\
            --enable-all-optimizations \\
            --enable-long-phy-address \\
            --enable-avx \\
            --enable-cpu-level=6 \\
            --enable-configurable-msrs \\
            --enable-fpu \\
            --enable-alignment-check \\
            --enable-svm \\
            --with-all-libs \\
            --enable-e1000 \\
            --enable-evex \\
            --enable-gdb-stub
```
を渡しました．`--enable-vmx=2`でeptの有効化，`--enable-x86-64`でx86-64の有効化，`--enable-e1000`でe1000の有効化ができます．
そのほかのオプションはbochs内で現在一番機能のあるcpumodelである`corei7_icelake_u`を動作させるために有効化しました．  

### イメージの取得
[公式に配布されているイメージ](http://bochs.sourceforge.net/diskimages.html)もあるのですが，
[このページ](https://defuse.ca/bochs-images.htm)でDebian Jessieインストール済みのディスクイメージが公開されているので，これを使うのが楽かと思います．
これらのイメージのユーザーはこのようになってます．  

```
Username: root
Password: toor

Username: bochs
Password: bochs
```

ディスクイメージからOSをインストールするのは(大変だと思うので)あまりお勧めではないです． 自分はうまく動かせませんでした...

### bochsrcの準備  
Bochsではエミュレートするマシンの情報をbochsrcというファイルに記述します．
自分は[こちら](https://defuse.ca/bochs-images.htm)のDebian Jessie起動用bochsrcを参考に

``` txt:bochsrc
info: action=report

romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
cpu: model=corei7_icelake_u, ips=1200000000
cpuid: x86_64=1, vmx=2, 1g_pages=1, pcid=1
clock: sync=realtime
megs: 2048
boot: disk

# gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0

# Hard disks.
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="DebianJessie64.img", cylinders=4161, heads=8, spt=63

# network
pci: enabled=1, chipset=i440fx

## linux
#e1000: mac=52:54:00:12:34:56, ethmod=linux, ethdev=enp0s25

# socket
e1000: mac=52:54:00:12:34:56, ethmod=socket, ethdev=40000, script=''
```

詳しい書き方は[マニュアル] (http://bochs.sourceforge.net/doc/docbook/user/bochsrc.html)を参照するのが良いと思います．  
基本的にはcpuのモデルに基づいて使える機能が決まりますが，cpuidで細かく設定することもできるようです．
ネットワークインタフェースに関しては[Bochsのマニュアル](http://bochs.sourceforge.net/doc/docbook/user/bochsrc.html#BOCHSOPT-NE2K)に書いてありますが，インターネットにつなぎたいときは`linux`を，bochs間で通信させたいときは`socket`を使いました．(それしかうまく動かなかったので...)
あと，gdbstubの行のコメントアウトを外すと，gdbを使ってデバッグができるようになります．

### 起動
bochsrcとイメージを用意したら，それらと同一のディレクトリで`bochs`コマンドをたたけばbochsのウィンドウが現れ，起動すると思います.  

## Tips
### Diskの操作
Diskにファイルをコピーしたいときは，自分はマウントして直接操作しました． 
 
```
mount -t ext4 -o loop,rw,offset=1048576 DebianJessie64.img.backup disk
```
でマウントできると思います．  
また，カーネルモジュールのコンパイルやファイルのダウンロードなどはマウント先ディレクトリに`chroot`して行いました．  
もしもっといい方法があれば教えてください．  

### イメージのリサイズ
1. qemu-imgでファイルサイズを拡大

```
qemu-img resize DebianJessie64.img +40G
```

2. partedでパーティションを変更

```
$ parted DebianJessie64.img
(parted) unit s
(parted) resizepart 2 -1s
(parted) q
```

3. resize2fsで拡大したパーティションをext2fsでフォーマット

```
$ losetup -f 
$ sudo mount -t ext2 -o loop,rw,offset=1048576 DebianJessie64.img disk
$ sudo resize2fs /dev/loop??
$ sudo umount disk
```

のようにしてイメージのリサイズを行いました．  

### ネットワーク
前述のとおり，ネインターネットにつなぎたいときは`linux`を，bochs間で通信させたいときは`socket`を使いました．  
また，`socket`を使いたいときには`bxhub`のプロセスが立ち上がっている必要があります．