子贡问为仁。子曰:"工欲善其事,必先利其器。居是邦也,事其大夫之贤者,友其士之仁者。"
这样子的解释对不对呢?子贡问孔子如何行仁,孔子说应该先和贤仁者交往。细心的朋友会发现这个比喻是有瑕疵的,毕竟"利器"的前提是把外界看作工具为我所用,但作引申表示"做足准备"就没错------开始实操之前,我们应先准备好所需的资源,部署工作环境。
我们回顾一下之后会用到的大家伙:首先当然是世界顶级编译器GCC(GNU Compiler Collection) ,其能编译的语言早已不止C,还包括了C++、Java、Go等多种语言;其次是汇编语言编译器NASM,既免费、又语法简洁、还支持Linux,真是个好东西。不过只有在不得不用时我们才使用汇编语言,因为汇编这个东西实在是有点......不是个东西。
虚拟机的话大家肯定就不陌生了,不多赘述。咱们从官网淘一个VMware,配置好ISO镜像文件(这次我们选Ubuntu)后直接开始爽玩。

接着配置一下Bochs。Ctrl+Alt+T启动终端,先更新软件包:
bash
sudo apt update
再安装编译环境和需要的库:
bash
sudo apt install -y build-essential
sudo apt install -y libx11-dev libxrandr-dev libsdl2-dev libgtk2.0-dev libwxgtk3.2-dev
但你要问我装上去的这些东西我是不是很懂------那可真是太不懂了: ) ,但不妨碍我们先装着。

然后把Bochs的压缩包请进来:
bash
cd Bochs #建议自建个文件夹,养成好习惯
wget https://sourceforge.net/projects/bochs/files/bochs/2.7/bochs-2.7.tar.gz
解压:
bash
tar -xzvf bochs-2.7.tar.gz
进入解压后的Bochs源码目录:
bash
cd bochs-2.7
接下来配置一些编译选项。同样还是不太懂,但这不影响我们先玩着:
bash
./configure \
--enable-debugger \ #Bochs内建调试器
--enable-gdb-stub \ #GDB编译
--enable-disasm \ #反汇编支持
--enable-iodebug \ #I/O口调试支持
--enable-x86-debugger \ #x86调试器支持
--with-x \
--with-x11 \
--with-sdl2 #这一坨with都是图形显示方式
好的到这里估计有小伙伴要蚌埠住了:我拿windows玩的,你这代码敲得我眼花缭乱的还容易敲错,能不能实现内外的copy-paste啊!答案自然是没问题,我们安装个open-vm-tools和桌面组件:
bash
sudo apt install -y open-vm-tools
sudo apt install -y open-vm-tools-desktop
接着重启一下虚拟机,或直接在终端输入:
bash
sudo reboot
回来之后一般就可以互相copy-paste了。接着我们给bochs配置硬件,即写一个配置文件给它,在启动时它就会根据文件内容创建自己了。对了,别忘记专门建一个oslab文件夹。
bash
cd ~/oslab
nano bochsrc
再将配置扔进去:
ini
# 1. 设置内存大小(32MB对于早期OS开发足够)
megs: 32
# 2. 设置BIOS和VGA BIOS(使用绝对路径确保可靠性)
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest
# 3. 硬盘控制器设置(现代语法)
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="hd60M.img", mode=flat, cylinders=121, heads=16, spt=63
# 4. 启动顺序:从硬盘启动(对应书中boot: disk)
boot: disk
# 5. 日志输出
log: bochsout.txt
# 6. 输入设备配置
mouse: enabled=0
keyboard: keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
# 7. 显示库设置(使用SDL2)
display_library: sdl2
# 8. GDB调试支持
gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
注意到这里有一个小硬盘,我们创建一个60MB的硬盘镜像:
bash
cd ~/oslab
dd if=/dev/zero of=hd60M.img bs=512 count=122880 #创建60MB的空镜像文件
最后我们预览一下预期的目录结构,后期可以修改:
text
~/oslab/
├── bochsrc # Bochs配置文件
├── hd60M.img # 60MB硬盘镜像
├── src/
│ ├── boot/ # 引导程序代码
│ └── kernel/ # 内核代码
├── bin/ # 编译后的二进制文件
└── obj/ # 目标文件
到这一步我们的行李箱就收拾的差不多了。
bash
cd ~/oslab
bochs -f bochsrc -q
键入后应该就能看到终端输出一些有意思的东西,再蹦出来个有意思的窗口,当然可能还带着报错(其实报错才是对的)。

如果没有仿真窗口弹出来,可以试试修改bochsrc文件使用其他的显示库:
bash
cd ~/oslab
# 备份原配置
cp bochsrc bochsrc.backup
# 创建使用其他显示库的配置
cat > bochsrc << 'EOF'
# Bochs 配置文件 - 使用可用显示库
megs: 32
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="hd60M.img", mode=flat, cylinders=121, heads=16, spt=63
boot: disk
log: bochsout.txt
mouse: enabled=0
keyboard: keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
# 尝试不同的显示库
# 选项1: 使用 x(X11)
display_library: x
# 如果上面不行,注释掉并尝试选项2: 使用 nogui(无图形界面)
# display_library: nogui
# GDB 调试支持
gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
EOF
至此我们的行李箱彻底收拾完了,可以发车了。