bochs

Table of Contents

bochs

前回やったxv6のMakefileに、こんなターゲットが登録されてた。

# run in emulators

bochs : fs.img xv6.img
        if [ ! -e .bochsrc ]; then ln -s dot-bochsrc .bochsrc; fi
        bochs -q

きっとqemuの代替え品だろう。FreeBSDのカタログには、こんな説明が掲載さ れていた。

Bochs is a highly portable open source IA-32 (x86) PC emulator written in
C++, that runs on most popular platforms.  It includes emulation of the
Intel x86 CPU, common I/O devices, and a custom BIOS.  Currently, bochs can
be compiled to emulate a 386, 486, Pentium, Pentium Pro or AMD64 CPU,
including optional MMX, SSE, SSE2 and 3DNow instructions.

Bochs is capable of running most Operating Systems inside the emulation
including Linux, DOS, Windows 95/98 and Windows NT/2000/XP.

Bochs was written by Kevin Lawton and is currently maintained by the Bochs
project.

Bochs can be compiled and used in a variety of modes, some which are still
in development. The 'typical' use of bochs is to provide complete x86 PC
emulation, including the x86 processor, hardware devices, and memory. This
allows you to run OS's and software within the emulator on your workstation,
much like you have a machine inside of a machine. For instance, let's say
your workstation is a Unix/X11 workstation, but you want to run Win'95
applications. Bochs will allow you to run Win 95 and associated software
on your Unix/X11 workstation, displaying a window on your workstation,
simulating a monitor on a PC.

bochs (master site)

run on Debian

このbochsなら、極小っぽいので、WSL2に入れてもいいかな。それより前に、 xv6がまともにコンパイル出来無いのを何とかしなければ。

compile

エラーは、こんな状況。

gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie -no-pie   -c -o mp.o mp.c                                                                                         In function ‘mpconfig’,
    inlined from ‘mpinit’ at mp.c:101:14:
mp.c:83:10: error: array subscript -48806446 is outside array bounds of ‘void[2147483647]’ [-Werror=array-bounds]                83 |   if(conf->version != 1 && conf->version != 4)
  :

これで良く教材になってたな。まて、時流に合わせて、コンプライアンス違反 が厳しくなった為ではなかろうか? CFLAGSに設定してある、-Werrorを削除し たら、一応ワーニングは出るものの、コンパイルは成功した。 気分が悪いので、ワーニングも握り潰しておいたぞ(それで委員会?)。

昔はフリーで使えるコンパイラーと言ったらgccしか無い独占企業だった。だ から、小難しいエラーに辟易しながらも、gccを使うしかなかった。その安泰 な世界に殴り込みをかけたのが、LLVM(Clanga)だ。こぞってBSDの世界の人達 は、Clangにチェンジ。親切なエラー表示や、使い回しが評価されて、ユーザー を獲得してきた。

gccの敵は更に表わてきた。そう、rustね。最近では、リナックスのカーネル の一部でも利用が始まっている。これはgccにとって非常な脅威になる。よっ て、-Werrorでコンパイルを失敗させる方針に打ってでた。多分、こういう事 情なんだろうな。

某親方みたいに、不祥事は見なかった事にして、先に行く。

run

bochsの付属品に、どんなのがあるか、確認する。

sakae@atom:~$ apt-cache search bochs
grub-firmware-qemu - GRUB firmware image for QEMU
bochs - IA-32 PC emulator
bochs-doc - Bochs upstream documentation
bochs-sdl - SDL plugin for Bochs
bochs-term - Terminal (ncurses-based) plugin for Bochs
bochs-wx - WxWindows plugin for Bochs
bochs-x - X11 plugin for Bochs
bochsbios - BIOS for the Bochs emulator
bximage - Disk Image Creation Tool for Bochs

bochs-termも入れた。そして、起動。

sakae@atom:~/xv6-public$ make bochs
 :
========================================================================
Bochs is exiting with the following message:
[      ] .bochsrc:497: directive 'vga_update_interval' not understood
========================================================================
00000000000i[SIM   ] quit_sim called with exit code 1
make: *** [Makefile:211: bochs] Error 1

どうも昔とconfigの文法が変ったみたいだ。少々もぐら叩き。それから、表示 装置がプラグインになってたので、.bochsrcに追加。こやつはコメントまみれな んで、有効な設定だけを抽出。

sakae@atom:~/xv6-public$ cat CPU
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
vga: extension=none
cpu: count=1, ips=10000000
megs: 256
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9
ata0-master: type=disk, mode=flat, path="xv6.img", cylinders=100, heads=10, spt=10
ata0-slave: type=disk, mode=flat, path="fs.img", cylinders=1024, heads=1, spt=1
boot: disk
log: LOG
panic: action=ask
error: action=report
info: action=report
debug: action=ignore
debugger_log: DLOG
parport1: enabled=1, file="/dev/stdout"
mouse: enabled=0
private_colormap: enabled=0
config_interface: textconfig
display_library: term

これで起動してみる。

sakae@atom:~/xv6-public$ bochs -qf CPU
 :
Bochs connected to screen "/dev/pts/12"
========================================================================
Bochs is exiting with the following message:
[HD    ] ata0-1: specified geometry doesn't fit on disk image
========================================================================

あえなく撃沈。その時のLOGの一部。

00000000000i[PLUGIN] init_dev of 'harddrv' plugin device by virtual method
00000000000i[HD    ] HD on ata0-0: 'xv6.img', 'flat' mode
00000000000i[IMG   ] hd_size: 5120000
00000000000i[HD    ] ata0-0: using specified geometry: CHS=100/10/10 (sector size=512)
00000000000i[HD    ] HD on ata0-1: 'fs.img', 'flat' mode
00000000000i[IMG   ] hd_size: 512000
00000000000i[HD    ] ata0-1: using specified geometry: CHS=1024/1/1 (sector size=512)
00000000000p[HD    ] >>PANIC<< ata0-1: specified geometry doesn't fit on disk image

出出しから躓いた。河岸を変えてOpenBSDでやってみるか。 OpenBSDならqemuもbochsも入れてあるからね。この2種の仮想化ソフトって、 どう違うの? オイラーの理解では、qemuの方はコンパイラー型の仮想化ソフ ト。対してbochsはインタープリタ型の仮想化ソフトだ。これらが消費するソー スは、xv.imgとかのdiskなんだな。

だから、WSL2/Debianでコンパイルした純正のdiskをOpenBSDに持ち込んでも、 問題なく動くはずだ。

run on OpenBSD

ふと、ata0-1 の設定を眺めていて、おかしい事に気付いた。C/H/Sにセクター サイズの512を乗じたら、DISKのサイズになるはず。所がそうなっていない。 これを検出して壊れたdiskって事でパニくったんだろう。

ata0-slave: type=disk, mode=flat, path="fs.img", cylinders=100, heads=1, spt=10

こんな、いかにも有りそうなdiskの定義に変更したよ。 そして起動したら、xv6が動き出した。教材と言っても、きちんとメンテナン スされていない。いや、これを突破出来なければ厳しいMITを卒業できないか ら、さっさと退学しろっていう試練?

This VGA/VBE Bios is released under the GNU LGPL                                
Please visit :
 . http://bochs.sourceforge.net
 . http://www.nongnu.org/vgabios

NO Bochs VBE Support available!

Bochs 2.7 BIOS - build: 08/01/21
$Revision: 14314 $ $Date: 2021-07-14 18:10:19 +0200 (Wed, 14 Jul 2021) $
Options: apmbios pcibios pnpbios eltorito rombios32

ata0 master: Generic 1234 ATA-6 Hard-Disk (   4 MBytes)
ata0  slave: Generic 1234 ATA-6 Hard-Disk (   0 MBytes)

Press F12 for boot menu.

Booting from Hard Disk...
cpu0: starting 0
sb: size 1000 nblocks 941 ninodes 200 nlog 30 logstart 2 inodestart 32 bmap star
t 58
init: starting sh
$ ls
.              1 1 512
..             1 1 512
README         2 2 10
cat            2 3 15180
echo           2 4 14060
forktest       2 5 8644
grep           2 6 17968
init           2 7 14684
kill           2 8 14152
ln             2 9 14048
ls             2 10 16636
mkdir          2 11 14176
rm             2 12 14156
sh             2 13 27852
stressfs       2 14 14920
usertests      2 15 61776
wc             2 16 15516
zombie         2 17 13732
console        3 18 0
$
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
IPS: 15.672M

IPS: 15.672Mって出ているのは、1500万命令/秒のスピードでx86の腐った命令 を解釈実行してますよって事だな。OpenBSDはこれに全力投球してます。ロー ド・アベレージが3近くになってました。

xv6を停止させる方法は無いので、bochsそのものを殺すしかない。そうすると、 bochsは、diskを使用中ですってフラグを落す事が出来ないので、痕跡が残っ たままになる。再起動する前に、削除しておこう。

ob$ ls *lock
fs.img.lock     xv6.img.lock

CPU=2 にしても一応動作はするものの、めっぽう遅くなる。

ob$ cat DLOG
Next at t=0
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
(1) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
c
Next at t=27988010
(0) [0x0000000f0872] f000:0872 (unk. ctxt): mov ax, word ptr ds:0x046c ; a16c04
(1) [0x00000009f048] 9f00:0048 (unk. ctxt): jmp .-3  (0x0009f047)     ; ebfd

gui-debug

debian/WSL2のbochsは、GUIなdebuugerが利用できる様にコンパイルされてい る。

config_interface: textconfig
display_library: x, options="gui_debug"

この設定を.bochsrc相当に追加すると、bochs起動で、GUIな制御画面が出てく る。後は、お好きにどうぞって感じだ。

exmple

本家のサイトを見ていたら、楽しい物を発見。インストール済みのdiskが提供 されている。実例で勝負しましょって訳だ。

Disk Images with Pre-installed Systems

OpenBSDなんてのが提供されてたので、試してみる。

ob$ cat bochsrc
megs: 32
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
vga: extension=vbe, update_freq=15
floppya: 1_44=a.img, status=inserted
boot: a
log: bochsout.txt
mouse: enabled=0
cpu: ips=15000000
pci: enabled=1, chipset=i440fx

フロッピィーから起動する時代がかった代物だな。肝心のメディアはどの様に 認識されるのかな?

ob$ file a.img | tr ',' '\n'
a.img: Unix Fast File system [v1] (little-endian)
 last mounted on /mnt
 last written at Mon Nov  6 18:14:03 2000
 clean flag 1
 number of blocks 2880
 number of data blocks 2815
 number of cylinder groups 1
 block size 4096
 fragment size 512
 minimum percentage of free blocks 0
 rotational delay 0ms
 disk rotational speed 5rps
 SPACE optimization

OpenBSDのご先祖様だな。起動したら、インストーラーの初画面が出てきた。 現在の物と全く同じ。どこかの、うわついた奴とは大違い。 termに切り替えてみると

ob$ bochs -qf bochsrc
 :
pcibios0: PCI bus #0 is the last bus V1.2
pci0 at mainbus0 bus 0: configuration mode 1 (bios)0]
"Intel 82371SB (Triton II) USB" rev 0x01 at pci0 dev 1 function 2 not configured
biomask 40 netmask 40 ttymask 42(PIIX4)" rev 0x03 at pci0 dev 1 function 3 not c
rd0: fixed, 3560 blocks Router at 000:01:0 ("Intel 82371FB (Triton) PCI-ISA" rev
roxtdev=0x1100 rrootdev=0x2f00:rawdev=0x2f,2                               DMA,
eraseN^?,fwerases^W, kill ^U,hintrs^C,astatusk^Timee fifo
(I)nstall, (U)pgrade or (S)hell? S^[OM
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
IPS: 680.700M

途中から画面制御が乱れ、最後は入力を受け付けなくなった。termって、こん な挙動になるの? そうだ、debianはどうか確認しれ。

at debian

diskをどう認識したか? 色々な解釈が出てきてる。セカンドオピニオン大事 だ。

sakae@atom:~/openbsd-img$ file a.img | tr ',' '\n'
a.img: DOS/MBR boot sector
 code offset 0x3c+2
 OEM-ID "OpenBSD"
 Media descriptor 0xf8
 sectors/track 0
 hidden sectors 16
 serial number 0
 label: " UNIX LABEL"
 FAT (1Y bit by descriptor); NTFS
 physical drive 0x290000
 sectors 2330693407946571776
 $MFT start cluster 5067957283254845772
 $MFTMirror start cluster -1556556397096460205
 clusters/RecordSegment 83
 serial number 06f6220676e696461
 checksum 0xfa00746f
sakae@atom:~/openbsd-img$ bochs -qf bochsrc
 :
Bochs connected to screen "/dev/pts/12"
Next at t=0
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
<bochs:1> c
bx_dbg_read_linear: physical memory read error (phy=0x0000322f3130, lin=0x00000000322f3130)
Next at t=678568
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
<bochs:2> c
bx_dbg_read_linear: physical memory read error (phy=0x0000322f3130, lin=0x00000000322f3130)
Next at t=1357326
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0

あれ、おかしい、起動しないな。ならば、xv6はどうだ?

Next at t=0
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
c
bx_dbg_read_linear: physical memory read error (phy=0x0000322f3130, lin=0x00000000322f3130)
Next at t=787482
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
c
bx_dbg_read_linear: physical memory read error (phy=0x0000322f3130, lin=0x00000000322f3130)
Next at t=1574975
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
(0).[1574975] [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0

これdebug-logなんだけど、OpenBSDと同じ挙動だ。どうもオイラーにはdebian なbochsは使いこなせないな。

いや、そうじゃないよ。これはWSL2の祟りです。その根源は勿論M$です。想定 外な事例には対処しませんっていう闇の世界がポックリと口をあけているのさ。

Arch Linux

ならばってんで、また河岸を変えた。けど、bochsは提供されていない。どう も先端を行く人達には、用が無いみたい。野良buildだな。

[sakae@arch ~]$ cat bochs-2.7/mine
./configure --enable-debugger \
            --enable-debugger-gui \
            --enable-x86-debugger \
            --enable-smp \
            --with-term \
            --with-x \
            --with-all-libs

こんな設定で、gui-debuggerがやっと作成できた。本家の説明書通りにやると、 イネーブルにはなるものの、ここではコンパイル出来ませんとログにでる。 configureを精査したら、gtk2が必要とな。で、最後は皆入りでごまかした (FreeBSDのMakefileを後で確認してみたら、sdlが指定してあれば、いいみたい)。

termモードで使おうとすると cu とかが必要になる。が、これまたArchには用 意されていない。代わりに minicom -s して、下記の設定を用意した。

[sakae@arch ~]$ cat /etc/minirc.dfl
# Machine-generated file - use "minicom -s" to change parameters.
pu port             /dev/pts/3
pu baudrate         9600
pu addlinefeed      Yes

そして起動。

Bochs connected to screen "/dev/pts/3"
Next at t=0
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
<bochs:1> c

continueする前に、minicomを起動して、まちかまえる。

[sakae@arch ~]$ minicom
  :
0 at fdc0 drive 0: 1.44MB 80 cyl, 2 head, 18 sec        patibility
biomask 40 netmask 40 ttymask 424: ns16550a, 16 byte fifo         K
rd0: fixed, 3560 bl cksd.org:/usr/src/sys/arch/i386/compile/RAMDISK
rootdev=0x1100 rrootdev=0x2f00 rawdev=0x2f02tel" 686-class) 15 MHz
WARNING:dfile system time much less thhn clock time      E,MCA,CMOV,PAT,PSE36,MM
eraseN^?,fwerases^W, kill ^U,hintrs^C,hstatusk^T

CTRL-A Z for help | 9600 8N1 | NOR | Minicom 2.9 | VT102 | Offline | pts/3

やはり、画面化け、入力を受け付けない。しょうがないので、Ctl-A X で minicomを終了する。

debugger