Ubuntu 22.04 LTS 下构建 Bochs 2.6.11 与 GeekOS 0.3.0 的实践指南
1. 环境准备与依赖安装
在Ubuntu 22.04 LTS上构建Bochs 2.6.11和GeekOS 0.3.0之前,我们需要先搭建好开发环境。相比之前的Ubuntu版本,22.04在软件包管理上有一些变化,特别是默认的gcc版本升级到了11.2.0,这可能会影响后续的编译过程。
首先打开终端,更新软件包列表:
sudo apt update接下来安装必要的构建工具和依赖库。这里我建议一次性安装所有依赖,避免后续编译时反复报错:
sudo apt install -y build-essential xorg-dev bison libgtk2.0-dev gcc-multilib libreadline-dev这里有几个关键点需要注意:
- gcc-multilib是必须的,因为GeekOS需要32位编译支持
- libreadline-dev在新版本中需要单独安装,否则Bochs的交互式调试功能会有问题
- 如果使用虚拟机环境,建议分配至少4GB内存,因为编译过程比较消耗资源
安装完成后,验证gcc版本:
gcc --version在Ubuntu 22.04上应该会显示11.2.0或更高版本。这个版本对后续编译GeekOS会有影响,我们后面会专门处理兼容性问题。
2. Bochs 2.6.11的编译与安装
2.1 获取源码与配置选项
首先下载Bochs 2.6.11的源码包:
wget https://sourceforge.net/projects/bochs/files/bochs/2.6.11/bochs-2.6.11.tar.gz tar zxvf bochs-2.6.11.tar.gz cd bochs-2.6.11配置编译选项时,我建议启用以下功能:
./configure \ --enable-debugger \ --enable-disasm \ --enable-x86-64 \ --enable-pci \ --enable-all-optimizations \ --enable-plugins \ --enable-cdrom \ --enable-a20-pin \ --enable-fpu \ --enable-alignment-check \ --enable-large-ramfile \ --enable-readline \ --enable-iodebug \ --enable-logging这里有几个关键配置说明:
- --enable-readline:提供更好的命令行编辑体验
- --enable-iodebug:方便调试I/O操作
- --enable-plugins:支持动态加载插件
2.2 编译与安装
配置完成后开始编译:
make -j$(nproc) sudo make install编译过程中可能会遇到几个常见问题:
- 如果报错缺少X11开发库,需要安装
libx11-dev - 如果提示readline相关错误,检查是否安装了
libreadline-dev - 链接阶段的内存不足问题,可以尝试减少并行编译线程数
安装完成后验证:
bochs --version应该能看到"Bochs x86 Emulator 2.6.11"的输出。
3. GeekOS 0.3.0的编译准备
3.1 安装NASM汇编器
GeekOS需要NASM汇编器,建议安装最新稳定版:
wget https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.gz tar zxvf nasm-2.15.05.tar.gz cd nasm-2.15.05 ./configure make -j$(nproc) sudo make install验证安装:
nasm --version3.2 获取GeekOS源码
下载GeekOS 0.3.0源码:
wget https://downloads.sourceforge.net/project/geekos/geekos/geekos-0.3.0/geekos-0.3.0.tar.gz tar zxvf geekos-0.3.0.tar.gz4. 编译GeekOS的特殊处理
4.1 解决gcc 11的兼容性问题
进入项目目录:
cd geekos-0.3.0/src/project0/build修改Makefile的关键部分:
- 找到
CC_GENERAL_OPTS行,移除-Werror:
CC_GENERAL_OPTS := $(GENERAL_OPTS)- 修改优化选项为
-O0并添加栈保护禁用:
GENERAL_OPTS := -O0 -Wall -fno-stack-protector $(EXTRA_C_OPTS)- 确保32位编译设置正确:
TARGET_CC := $(TARGET_CC_PREFIX)gcc -m32 HOST_CC := gcc -m32 TARGET_LD := $(TARGET_CC_PREFIX)ld -m elf_i3864.2 编译过程
执行完整编译流程:
sudo make clean sudo make depend sudo make如果一切顺利,最后会看到生成fd.img的提示。这个映像文件包含了编译好的GeekOS系统。
5. Bochs配置与系统运行
5.1 创建Bochs配置文件
在build目录下创建.bochsrc文件:
nano .bochsrc写入以下内容(注意根据实际路径调整):
megs: 32 romimage: file=/usr/local/share/bochs/BIOS-bochs-latest vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest floppya: 1_44=fd.img, status=inserted boot: floppy log: bochsout.txt mouse: enabled=0 keyboard: keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map5.2 运行GeekOS
启动Bochs模拟器:
bochs -f .bochsrc在启动菜单中选择"6"开始模拟,然后在命令行提示符输入"c"继续执行。如果一切配置正确,你应该能看到GeekOS的欢迎界面。
6. 常见问题排查
在实际操作中可能会遇到以下问题:
BIOS镜像找不到: 检查
/usr/local/share/bochs/目录是否存在,如果缺少BIOS文件,可以从源码包的bios目录复制段错误(Segmentation Fault): 尝试重新编译Bochs并添加
--enable-a20-pin选项键盘映射问题: 确保
.bochsrc中的keymap路径正确,或者尝试其他键盘映射文件GeekOS启动失败: 检查fd.img是否生成成功,必要时重新执行make
32位兼容性问题: 安装32位库支持:
sudo apt install gcc-multilib g++-multilib
7. 进阶调试技巧
对于想要深入研究的开发者,这里分享几个实用技巧:
使用Bochs调试器: 在启动时添加
-q选项跳过菜单直接运行,然后使用调试命令:break 0x7c00 # 在MBR加载处断点 c # 继续执行查看寄存器状态: 在Bochs调试器中输入:
info registers内存检查:
x /16bx 0x7c00 # 查看0x7c00处的16字节内存修改GeekOS源码: 可以尝试修改
src/project0下的源码,体验操作系统开发过程性能优化: 在
.bochsrc中添加:cpu: count=1, ips=10000000可以调整模拟速度
