跳转至

📔 第 01 章 部署工作环境 学习笔记

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
    

    解决方案:

    1
    2
    3
    # 在编译的当前文件目录中,修改文件的名字
    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 这一行的内容复制硬盘设置的那一行。注释掉原来的硬盘。

1
2
3
# 硬盘设置
# 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