虚拟机centos7的环境配置
如何下载安装Centos7虚拟机以及对yum换成阿里源,网上的教程很多,下面这两篇是不错的教程。
Centos虚拟机的安装
Centos换成阿里源
安装以下工具:
- gcc,GUN C语言编译器。
yum install -y gcc
- as,GAS汇编语言编译器,用于编写AT&T格式的汇编语言。Debian系列的linux系统GAS位于binutils中,所以安装命令为
sudo apt-get install build-essential
而在centos中则是
yum install make automake gcc gcc-c++ kernel-devel
# 或者安装大而全的包
yum groupinstall "Development Tools" "Development Libraries"
确保接下来有nasm(NASM汇编语言编译器,用于编写Intel格式的汇编语言。),ld(连接器),make(编译工具),objdump(反汇编命令),objcopy(文件提取命令)。
这里如果将文件拖拉或者复制到虚拟机会有error when getting information的报错,那么就需要使用命令yum remove open-vm-tools
先卸载open-vm-tools,然后重新安装vmtools(网上教程很多),最后通过命令yum install open-vm-tools -y
重新安装open-vm-tools。如果重启后不能粘贴复制,那么执行下面的命令:
sudo yum update
sudo yum install -y open-vm-tools-desktop
bochs的安装配置
bochs的简单介绍
Bochs(发音:box)是一个以LGPL 许可证发放的开放源代码的 x86、x86-64IBM PC 兼容机模拟器和调试工具。它支持处理器(包括保护模式)、内存、硬盘、显示器、以太网、BIOS、IBM PC 兼容机的常见硬件外设的仿真。许多客户操作系统能通过该仿真器运行,包括 DOS、Microsoft Windows 的一些版本、AmigaOS 4、SD、Linux、MorohOS、Xenix 和 Rhapsody(Mac OSX的前身)。Bochs 能在许多主机操作系统运行,例 Windows、Windows Mobile、Linux、Mac OS X、iOS和PlayStation 2。Bochs 主要用于操作系统开发(当一个模拟操作系统崩溃,它不崩溃主机操作系统,所以可以调试仿真操作系统)和在主机操作系统运行其他操作系统。它也可以用来运行不兼容的旧的软件(如电脑游戏)。它的优点在于能够模拟跟主机不同的机种,例如在 Sparc 系统里模拟 x86,但缺点是它的速度却慢得多。
安装bochs(以bochs2.6.11为例)
到官网下载合适的版本,有人推荐最新版,说法是这款软件在完善中新版bug少,但我亲身实践2.8会发生段错误(Segmentation fault (core dumped)
)。于是改用bochs-2.6.11.tar.gz,将其拖入Centos合适的地方,并打开终端用以下命令解压:
tar -zxvf bochs-2.6.11.tar.gz
然后执行
cd your_path/bochs-2.6.11
最后用configure,make,make install三部曲来编译。我使用的configure参数是这些:
./configure \
--prefix=/usr/local/share/bochs \
--with-x11 \
--with-wx \
--with-x \
--enable-debugger \
--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
- –prefix用于指定bochs安装位置。
- –enable-debugger ,打开bochs自己的调试器。如果想用gdb调试,可以将其改成–enable-gdb-stub。但不能同时打开。如果想同时使用可以用–prefix指定不同的版本。
- –enable-iodebug,启用io接口调试器
- –enable-x86-debugger,支持io调试器
- –with-x11,使用x11图形用户接口。
其余参数请自行到官方文档查看。
configure之后就可以生成make要用的makefile文件,然后执行make
。
我在make的时候(2.8版会遇到)遇到了如下的错误。
debug.h:25:20: fatal error: config.h: No such file or directory
#include "config.h"
最后发现是头文件引用路径的问题,找到报错文件的报错位置再在该文件的对头文件的错误引用改成相对路径。如config.h
文件在debug.h
文件的上一目录,将#include "config.h"
改成#include "../config.h"
。
第二个错误是
make[1]: 进入目录“/home/wxer/os_dev/bochs/bochs-2.6.11/bx_debug”
g++ -c -I.. -I./.. -I../instrument/stubs -I./../instrument/stubs -I. -I./. -g -O2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -pthread dbg_main.cpp -o dbg_main.o
In file included from dbg_main.cpp:28:
dbg_main.cpp: 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))
| ^~~~~~~~~~~~~~~
dbg_main.cpp:1497:18: note: in expansion of macro ‘BX_ITLB_INDEX_OF’
1497 | Bit32u index = BX_ITLB_INDEX_OF(laddr);
| ^~~~~~~~~~~~~~~~
../cpu/cpu.h:383:28: error: invalid use of ‘this’ in non-member function
383 | # define BX_CPU_THIS_PTR this->
| ^~~~
../cpu/tlb.h:59:37: note: in expansion of macro ‘BX_CPU_THIS_PTR’
59 | #define BX_DTLB_INDEX_OF(lpf, len) (BX_CPU_THIS_PTR DTLB.get_index_of((lpf), (len)))
| ^~~~~~~~~~~~~~~
dbg_main.cpp:1501:11: note: in expansion of macro ‘BX_DTLB_INDEX_OF’
1501 | index = BX_DTLB_INDEX_OF(laddr, 0);
| ^~~~~~~~~~~~~~~~
make[1]: *** [Makefile:67:dbg_main.o] 错误 1
make[1]: 离开目录“/home/wxer/os_dev/bochs/bochs-2.6.11/bx_debug”
make: *** [Makefile:330:bx_debug/libdebug.a] 错误 2
在bx_debug/dbg_main.ccp中找到下面的代码并修改
void bx_dbg_tlb_lookup(bx_lin_address laddr)
{
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);
}
第三个错误是
make: *** No rule to make target `iodev/hdimage/hdimage.cc', needed by `misc/hdimage.o'. Stop.
如果遇到"由于确少?.cc而不能合成…"的问题用cp命令将后缀名为?.cpp的文件复制到一个相同路径名称,后缀为.cc的文件即可。如上的报错可以复制hdimage.cpp,粘贴到相同目录改为hdimage.cc。基本上是以下几个:
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
最后使用make install
就大功告成了。
配置bochs
在安装目录的share/doc/bochs/bochsrc-sample.txt是官方给的参考案例,我的配置内容如下:
# 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
#设置对应真实机的BIOS
romimage: file=/usr/local/share/bochs/share/bochs/BIOS-bochs-latest
#设置对应真实机的VGA BIOS
vgaromimage: file=/usr/local/share/bochs/share/bochs/VGABIOS-lgpl-latest
#选择启动盘符,disk是硬盘启动,floppy是软盘启动
boot: disk
# floppy_bootsig_check: disabled=0
#设置Bochs所使用的磁盘,若只有一个磁盘使用floppya即可,若有多个则为floppyb等
#插入软盘的类型为容量1.44MB的软盘,软盘镜像文件中的文件名为boot.img,状态是已插入
#写保护开关置于关闭状态。
#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和cpuid都描述处理器的相关信息
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=0xla, stepping=5, vendor_string="GenuineIntel", brand_string="Intel(R) Core(TM) 17-4770 CPU (Haswell)"
print_timestamps: enabled=0
debugger_log: bochs.out
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: bochs.out
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: enabled=0, toggle=ctr1+mbutton
speaker: enabled=1, mode=system
parport1: enabled1, file=none
parport2: enabled=0
com1: enabled=1, mode=null
com2: enabled=0
com3: enabled=0
com4: enabled=0
#设置Bochs在运行过程中能够使用的内存,单位是MB
megs: 2048
#已过时
# keyboard_mapping: enabled=1,map= "/root/bochs-2.8/gui/keymaps/x11-pc-us.map"
#为配置gdb调试的,不用gdb不要加上去
# gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
注意配置文件中都是英文符号,且:后面的信息都要在同一行,直到遇到下一个:以及其前面的单词。逗号后都有一个空格。
遇到的问题
a bochsrc option needs at least one parameter
去掉中文注释。
运行bochs
找到bochs的安装目录,进入命令行运行bochs文件。如下图
选择【2】用于加载配置文件,就是先前的bochsrc.disk。
在对应的位置输入bochsrc的名字。我的bochsrc放在bochs的安装目录。
在centos7的命令行使用bin/bximage创建镜像文件。
运行这个程序后选择对应的选项。我的image文件的参数如下:
ata0-master: type=disk, path="hd60M.img", mode=flat
即将原来的ata0-master的参数改掉。
回到bochs的命令行界面,选择【6】运行。当然还会让你再重新选择一次配置文件。可以在进入bochs的命令行前使用-f
参数。
bin/bochs -f bochsrc.disk
进入界面后输入c
,即continue,让bochs继续运行。如下图
最后出现提示No bootable device
如下图
报错的原因是还没有编写bootloader引导启动程序,之后编写BootLoader引导启动程序,使用dd
命令将程序写入hd60M.img。注意,未创建img文件同样会引发这个错误,但没有ata0 master
这一行。