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.
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を終了する。