0. 内容说明
- 本内容依据《操作系统真象还原》进行学习,在学习过程中,由于新版本和旧版本bochs存在参数差异,故此会出现一些调试错误。也记录对应的解决方案。
1. 需要的编译器
对于现代OS来说,主要使用 C语言
和 汇编语言
两种语言。
所以主要选择对应两种语言的编译器:
- C语言:gcc编译器
- 汇编语言:nasm。
选择理由:开源。
1.1 gcc编译器
GNU编译器套装(GNU Compiler Collection,GCC),是GNU开发的编程语言编译器。
在Linux环境部署过程中,直接使用对应OS的指定指令去安装对应的gcc编译器即可。
1.2 nasm编译器
NASM是为了可移植性与模块化而设计的一个80x86的汇编器。支持不同的目标文件格式。
使用汇编语言开发OS的原因:
- 需要与硬件直接打交道。
- 处理的代码逻辑需要兼顾硬件的多样性,以及对硬件进行直接指令操作。
2. OS的宿主环境
OS归属于软件,但不是一般的软件。程序本身需要依赖于OS支持。
2.1 虚拟机相关的概念
虚拟机就是通过软件来模拟硬件。
虚拟机就是一个模拟了硬件资源的普通进程。对于虚拟机中的操作,都是需要通过虚拟机的检查,然后代为向OS提交操作请求。
使用虚拟机的原因:
-
运行方便
- 在宿主机系统上就是一个用户进程。
- 对于进程可以随意启动,虚拟机也是如此。
-
保护主体计算机
- 代码崩溃时,可以及时重启计算机。
- 避免宿主机重启太多次。
对于虚拟机来说,有很多的选择,一般有 qemu、bochs、virtualBox、xen 和 Vmware
等等。但是虚拟机的选择来说,就是能工作、调试、够用足矣。
2.2 virtualBox环境准备
关于VirtualBox安装部署虚拟机的步骤,请参考详细文章,不再过多赘述。
参考文章:https://www.debugpoint.com/install-ubuntu-windows-virtualbox/
工具平台 | 下载地址 |
---|---|
Oracle VirtualBox | https://www.virtualbox.org/wiki/Downloads |
Ubuntu 20.04 iso 镜像文件 | https://releases.ubuntu.com/focal/ |
ubuntu中安装gcc编译器方式:
sudo apt-get install gcc g++ make nasm -y # 后续编译bochs时需要
由于我使用的是USB的方式,在virtual1Box中会出现如下报错方式:
-
不能分配USB设备到虚拟电脑
-
解决方案:到链接:https://download.virtualbox.org/virtualbox/ 中找到对应virtualBox版本的扩展插件。由于我使用的是 6.1.46版本,可以下载如下结尾的文件。
- 文件下载完成后,进行插件的配置。第三步时找到自己下载的插件进行加载即可。
- 在完成插件配置之后,进行USB接口的设置。
-
2.3 Boches相关准备
Bochs是一个LGPL源代码许可协议的x86、x86-64IBM、PC兼容机模拟器和调试工具。支持处理器(包括保护模式)、内存、硬盘、显示器、以太网、BIOS、IBM PC
Bochs下载地址(本人使用的版本:2.6.11):https://sourceforge.net/projects/bochs/files/bochs/2.6.11/
下载文件完成后,开始解压并进行编译过程。
tar -xvf bochs-2.6.11.tar.gz
cd bochs-2.6.11
# 开始使用如下命令开始编译
./configure \
--prefix=/data/bochs \
--enable-debugger \
--enable-disasm \
--enable-iodebug \
--enable-x86-debugger \
--with-x \
--with-x11
# 编译完成后,可以使用如下命令安装
make install
对于编译参数的说明:
--prefix=/data/bochs
:指定bochs的安装目录--enable-debugger
:打开bochs自己的调试器。看自己的选择,也可以使用远程gdb调试器(参数:--enable-gdb-stub
)--enable-disasm
:让bochs支持反汇编--enable-iodebug
:支持io接口调试器--enable-x86-debugger
:支持x86调试器--with-x
:使用x window--with-x11
:使用x11图形用户接口
由于我试着编译了两个版本:bochs自己的调试器
和 gdb调试器
。出现过如下错误:
-
gdb调试器版本出现的错误
在编译过程中会出现如下错误,是因为在configure文件执行过程中就已经找不到x11文件库。
可以使用如下命令方式(参考链接:https://ubuntuforums.org/showthread.php?t=1843305) :
sudo apt-get install libx11-dev -y
在解决问题后,又会出现如下错误:
install: cannot stat './bochsdbg': No such file or directory
解决方案:
# 在编译的当前文件目录中,修改文件的名字 cd bochs-2.6.11 cp bochs bochsdbg
再次重新编译即可。
-
bochs自己的调试器 编译时出现的错误
- 由于先编译 gdb远程调试器的版本,目前未发现错误。
2.4 配置Bochs
进入安装目录进行配置 bochs.disk
文件。使用 .disk
区分启动文件。
由于存在版本的差异,有些参数在最新版本无法使用,可以根据后续错误解决方案进行分析解决。
# 设置Bochs在运行过程中能够使用的内存
# 关键字:megs
megs: 32
# 设置对应真实机器的BIOS 和 VGA BIOS
# 对应的关键字:romimage 和 vgaromimage
romimage: file=/data/bochs-debugger/share/bochs/BIOS-bochs-latest
vgaromimage: file=/data/bochs-debugger/share/bochs/VGABIOS-lgpl-latest
# 设置bochs所使用的磁盘,软盘的关键字未floppy。
# 若只有一个软盘,则使用 floppya即可,若有多个,则为 floppya,floppyb...
# floppya: 1_44=a.img, status=inserted
# 选择启动盘符
# boot: floppy # 默认从软盘启动,将其注释
boot: disk # 改为硬盘启动。任何代码都将直接写在硬盘上,所以不会再有读写软盘的操作。
# 设置日志文件的输出
log: bochs.out
# 开启或关闭某些功能
# 下面是关闭鼠标,并关闭键盘
mouse: enabled=0
keyboard_mapping: enabled=1,
map=/data/bochs-debugger/share/bochs/keymaps/x11-pc-us.map
# 硬盘设置
ata0:enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
# 增加的bochs对gdb的支持,使得gdb可以远程连接到此机器的1234端口进行调试
gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
2.5 运行Bochs
-
进入 bochs的安装目录,然后启动执行文件。默认提示选择符为2。
-
直接键入Enter,然后再输入配置文件:bochs.disk ,等待默认提示符变成[6],说明可以开始进行模拟。
2.6 运行bochs的过程中出现错误
在加载配置文件的过程中,出现如下错误PANIC的原因:
解决方案:通过bochs提供的工具 ./bximage
进行创建虚拟硬盘。
查看工具支持的信息如下:
./bximage -hd=60M -mode="create" -q hd60M.img
创建成功后,显示如下:
在创建虚拟硬盘成功后,直接将 ata0-master 这一行的内容复制硬盘设置的那一行。注释掉原来的硬盘。
# 硬盘设置
# ata0:enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="hd60M.img", mode=flat
在直接使用 ./bochs/bochs -f bochsrc.disk
指令后,出现了语法上的错误:
>>PANIC<< bochsrc.disk:27: keyboard directive malformed.
查看了官网对keyboard的最新版本(https://bochs.sourceforge.io/doc/docbook/user/bochsrc.html)设置格式。直接修改为如下内容:
keyboard: keymap=/data/bochs-debugger/share/bochs/keymaps/x11-pc-us.map
后续会出现 >>PANIC<< bochsrc.disk:34: Bochs is not compiled with gdbstub support
,原因:在编译时,没有对远程gdb调试器进行编译。对于该问题解决方案就是直接将 配置文件中的 gdbstub一行
注释掉即可。
在进行成功加载后显示提示符[6]时,直接enter后,也会出现如下的错误:
解决方案:修改配置文件内容,将其path指定为绝对路径即可。
ata0-master: type=disk, path="/data/bochs-debugger/bin/hd60M.img", mode=flat