bochs

bochs

Bochs 安装

2020/10/10 更新: Ubuntu20.04下安装Bochs

在学操作系统,想学着自己写一个玩,就找了书来读,第一步就是在 Linux 环境下安装 Bochs(一款开源的可调式虚拟机软件)

配环境什么的,我折腾过很多了,完全不怕!(然后就折腾了一下午)


!--![laji.jpg](https://i.loli.net/2020/09/24/yT4iEFjpecbLVvS.jpg)--

准备好 Linux 系统

我本机是 Win10,又不想折腾双系统,就用 VMware 配了一个虚拟机,使用 CentOS7 的镜像

VMware 配虚拟机不需要多说,这个都用过,强烈建议装带图形界面的系统,不然后面安装和使用的时候会比较难受。

如果配的网络不行,或者想使用固定 IP 的形式,可以参考这篇博客:

CentOS7安装详解

下载并解压 Bochs

下载官网

下不下最新版都可以,关键是要尽可能减少安装时的痛苦(?),所以我选择的是和安装教程同一个版本的

记得下载 .tar.gz

正常解压,如果你使用的是图形界面,直接双击可以解压,也可以命令行解压:

tar zxvf bochs-xx.xx.xx.tar.gz

编译安装

最痛苦的过程,我把我成功的流程发出来,说不定换个电脑就不行了

先安装各种依赖:

1
2
3
sudo yum install gtk2 gtk2-devel
sudo yum install libXt libXt-devel
sudo yum install libXpm libXpm-devel

进入解压后的目录,然后执行:

1
./configure --with-x11 --with-wx --enable-debugger --enable-disasm --enable-all-optimizations --enable-readline --enable-long-phy-address --enable-ltdl-install --enable-idle-hack --enable-plugins --enable-a20-pin --enable-x86-64 --enable-smp --enable-cpu-level=6 --enable-large-ramfile --enable-repeat-speedups --enable-fast-function-calls  --enable-handlers-chaining  --enable-trace-linking --enable-configurable-msrs --enable-show-ips --enable-cpp --enable-debugger-gui --enable-iodebug --enable-logging --enable-assert-checks --enable-fpu --enable-vmx=2 --enable-svm --enable-3dnow --enable-alignment-check  --enable-monitor-mwait --enable-avx  --enable-evex --enable-x86-debugger --enable-pci --enable-usb --enable-voodoo

有不少 no 是很正常的现象,我遇见的问题大致如下:

Permission denied

su 切换成 root,全部安装完成后再切回来(su - your_name)

sudo ./configure....

xxx is not in the sudoer file

  1. su root (su -l) 输入root用户密码
  2. chmod u+w /etc/sudoers
  3. vim /etc/sudoers, 在 ROOT ALL=(ALL)ALL 下加一行:xxx ALL=(ALL) ALL 然后保存并退出。其中xxx是你要加 sudo 权限的用户名
  4. chmod u-w /etc/sudoers
  5. su - xxx

no acceptable C compiler found in $PATH

没装 gcc

sudo yum install gcc

configure: error: C++ preprocessor “/lib/cpp” fails sanity check

出现该情况是由于 C++ 编译器的相关包没有安装

sudo yum install glibc-headers, sudo yum install gcc-c++

如果你没有用图形界面,好像还会报别的错误,这时候需要安装一些别的包(所以为啥要自己为难自己呢)

上面步骤没啥问题后执行编译

make

sudo make install

当然不会一帆风顺:

没有规则可以创建 “misc/bximage.o” ……

原因是没有 .cc 文件,按照书上的方法我们将 .cpp 拷贝一份成 .cc 文件即可

1
2
3
4
5
6
cp misc/bximage.cpp misc/bximage.cc
cp iodev/hdimage/hdimage.cpp iodev/hdimage/hdimage.cc
cp iodev/hdimage/vmware3.cpp iodev/hdimage/vmware3.cc
cp iodev/hdimage/vmware4.cpp iodev/hdimage/vmware4.cc
cp iodev/hdimage/vpc-img.cpp iodev/hdimage/vpc-img.cc
cp iodev/hdimage/vbox.cpp iodev/hdimage/vbox.cc

ISO C++ 不允许成员 PHY_MEM_PAGES 的初始化

我是真的不知道这个问题咋解决,出现的时候我用的是 Centos6 的镜像,重新解压编译也不行,就换成了Centos7,就没这问题了…

symbols: DSO missing from command line collect2: error: ld returned 1 exit status

网上很多博客都说的一个问题,我是没遇见

在 Makefile 的 LIBS 中添加如下内容: -lz -lrt -lm -lpthread

全部完成之后试着打开一下,如果像下面一样就没啥问题了:

完成

.brochsrc 的配置

ls 是看不见有这个文件的,需要 ls -a 才能看见,我们有一个默认的,记得修改之前备份一下

按照任何一个教程里的,或者书上的文件配置复制粘贴进去就行了

.brochsrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# configuration file generated by Bochs
plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, parallel=1, serial=1, iodebug=1
config_interface: textconfig
display_library: x
#memory: host=2048, guest=2048
romimage: file="/usr/local/share/bochs/BIOS-bochs-latest"
vgaromimage: file="/usr/local/share/bochs/VGABIOS-lgpl-latest"
boot: floppy
floppy_bootsig_check: disabled=0
floppya: type=1_44, 1_44="boot.img", status=inserted, write_protected=0
# no floppyb
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=none
ata0-slave: type=none
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata1-master: type=none
ata1-slave: type=none
ata2: enabled=0
ata3: enabled=0
pci: enabled=1, chipset=i440fx
vga: extension=vbe, update_freq=5

cpu: count=1:1:1, ips=4000000, quantum=16, model=corei7_haswell_4770, reset_on_triple_fault=1, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0, msrs="msrs.def"

cpuid: x86_64=1,level=6, mmx=1, sep=1, simd=avx512, aes=1, movbe=1, xsave=1,apic=x2apic,sha=1,movbe=1,adx=1,xsaveopt=1,avx_f16c=1,avx_fma=1,bmi=bmi2,1g_pages=1,pcid=1,fsgsbase=1,smep=1,smap=1,mwait=1,vmx=1
cpuid: family=6, model=0x1a, stepping=5, vendor_string="GenuineIntel", brand_string="Intel(R) Core(TM) i7-4770 CPU (Haswell)"

print_timestamps: enabled=0
debugger_log: -
magic_break: enabled=0
port_e9_hack: enabled=0
private_colormap: enabled=0
clock: sync=none, time0=local, rtc_sync=0
# no cmosimage
# no loader
log: -
logprefix: %t%e%d
debug: action=ignore
info: action=report
error: action=report
panic: action=ask
keyboard: type=mf, serial_delay=250, paste_delay=100000, user_shortcut=none
mouse: type=ps2, enabled=0, toggle=ctrl+mbutton
speaker: enabled=1, mode=system
parport1: enabled=1, file=none
parport2: enabled=0
com1: enabled=1, mode=null
com2: enabled=0
com3: enabled=0
com4: enabled=0

megs: 2048

制作软盘

一定要在你编译完成的文件夹下执行命令 ./bximage

然后选择 1(Create new floppy or hard disk image)

然后输入 fd(创建一个软盘)

然后回车(大小默认)

然后起一个名字 如 boot.img

做好的软盘 boot.img 默认在当前文件夹中,要放在 bochs 的文件夹根目录中,不要移动了

更新

由于 Centos7 使用体验极差(虚拟机出了各种问题)索性换到 Ubuntu20.04

大致可能出现的问题和前面类似,不再赘述,说一些新的问题

缺少 usb_uhci 巴拉巴拉一些

不会处理,看了网上的别人说的,这是低版本 Bochs 源码的问题,建议使用高版本

好吧,使用最新的 2.6.11

源码编译的时候出错

问题就像下面一样,这次好,有解决方案

x86_64-pc-linux-gnu-g++ -c -I.. -I./.. -I../instrument/stubs -I./../instrument/stubs -I. -I./. -march=native -O2 -pipe -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -pthread -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT dbg_main.cc -o dbg_main.o
In file included from dbg_main.cc:28:
dbg_main.cc: In function ‘void bx_dbg_tlb_lookup(bx_lin_address)’:
../cpu/cpu.h:383:28: error: invalid use of ‘this’ in non-member function
383 | # define BX_CPU_THIS_PTR this->
| ^~
../cpu/tlb.h:62:32: note: in expansion of macro ‘BX_CPU_THIS_PTR’
62 | #define BX_ITLB_INDEX_OF(lpf) (BX_CPU_THIS_PTR ITLB.get_index_of(lpf))
| ^
~
……

解决方案:

找到 bx_debug/dbg_main.cc 或者是 dbg_main.cpp, 修改里面的部分代码(记得原版备份)

1
2
3
4
5
6
7
8
9
10
11
12
char cpu_param_name[16];

- Bit32u index = BX_ITLB_INDEX_OF(laddr); //这一行改成下面一行
+ Bit32u index = BX_CPU(dbg_cpu)->ITLB.get_index_of(laddr);
sprintf(cpu_param_name, "ITLB.entry%d", index);
bx_dbg_show_param_command(cpu_param_name, 0);

- index = BX_DTLB_INDEX_OF(laddr, 0); //同理
+ index = BX_CPU(dbg_cpu)->DTLB.get_index_of(laddr);
sprintf(cpu_param_name, "DTLB.entry%d", index);
bx_dbg_show_param_command(cpu_param_name, 0);

重新编译即可正常的运行

真难……

Author

Ctwo

Posted on

2020-09-24

Updated on

2020-11-06

Licensed under

Comments