参考《操作系统真象还原》这本书,自己写一个轻量级操作系统,本系列博客用于记录本人在开发期间学习到的知识和解决的问题。
首先是第一章,部署工作环境,本人是在VMware上安装的Ubuntu20.04上进行开发,且主要参考该b站教程和其作者的博客,建议把该作者博客和本文章搭配食用。
一、安装必要工具与依赖
在Ubuntu的终端中依次输入以下3条命令。
✅ 1. sudo apt install build-essential
📌 作用:安装 C/C++ 编译相关的基础工具链
执行这个命令会安装一组最常用、最基础的软件包,包括但不限于:
| 工具 | 作用 |
|---|---|
| gcc | GNU C 编译器 |
| g++ | GNU C++ 编译器 |
| make | Makefile 构建系统 |
| dpkg-dev | Debian 编译环境 |
| libc6-dev | glibc 开发头文件(如 stdio.h 等) |
📌 为什么做 OS 开发必装它?
在《操作系统真相还原》中,你需要:
-
编译自己的引导扇区(MBR)
-
编译自己的 32/64 位内核
-
编译/构建 Bochs(模拟器)
-
编译其它工具程序
这些都需要:
-
gcc
-
make
而 build-essential 一次性就把这些东西拉全了。
📌 结论
这是必须装的,操作系统开发基本环境的核心。
在向阿里云镜像网站拉取这些包的时候,ubuntu连不上网,ping不到它,解决过程在另一篇文章中。
✅ 2. sudo apt-get install libghc-x11-dev(存疑,为保险起见可以安装上)
📌 作用:安装 Haskell 的 X11 图形界面开发库
注意,这个包的名字里有 ghc:
-
ghc = Glasgow Haskell Compiler(Haskell 编译器)
-
libghc-x11-dev是 Haskell 语言用的 X11 绑定库
它和 C/C++ 的 X11 开发库 不是一回事。
📌 它用于什么?
用于 Haskell 程序 开发 GUI 时调用 X11(比如 Haskell 的图形界面程序)。
📌 和 OS 开发有什么关系?
💥 基本没关系。
这个并不是 Bochs 编译所必需的。
网上某些教程列了它,但实际上是“把所有跟 X11 相关的包都列上了”,而你并不需要 Haskell 的 X11 库。
📌 结论:
不是必须。可以不安装。
你安装失败也没关系,因为你根本不需要它。
✅ 3. sudo apt-get install xorg-dev
📌 作用:安装 X11 图形开发环境
xorg-dev 是一个元包,包含:
| 包名 | 作用 |
|---|---|
| libx11-dev | X11 核心 GUI 库的开发头文件 |
| libxrandr-dev | 屏幕分辨率调整相关 |
| libxrender-dev | 渲染扩展库 |
| libxext-dev | X11 扩展功能 |
| proto 头文件 | X11 各种协议头文件 |
等等……
📌 为什么 Bochs 需要它?
你要编译 Bochs,特别是开启 GUI(图形界面),会用到 X11:
例如执行 ./configure 时,你会看到这些选项:
--enable-x11 --with-x11
如果缺少 X11 的开发头文件(如 X11/Xlib.h),configure 会报错。
📌 所以它对你的 OS 项目来说?
是必须的。
《操作系统真相还原》中,你会使用 Bochs 的 GUI 来观察:
-
内存
-
寄存器
-
CPU 状态
-
指令执行情况
必须有图形界面。
🔍 最终总结(按必要性排序)
| 命令 | 是否必要 | 用途 |
|---|---|---|
sudo apt install build-essential | ⭐ 必须 | 安装 GCC、make 等编译工具 |
sudo apt-get install xorg-dev | ⭐ 必须 | 让 Bochs GUI 能编译运行 |
sudo apt-get install libghc-x11-dev | ❌ 不需要 | Haskell 的 X11 库,与 OS 项目无关 |
✅ 4. sudo apt install nasm
nasm 是一个汇编器(assembler)
全称为:
Netwide Assembler
它是目前 编写 x86、x86_64 操作系统引导程序、内核启动代码 的最常用汇编器。
为什么你必须安装 nasm?(重点)
你现在根据《操作系统真相还原》写 MBR 程序,例如:
mov ax, 0x0600
mov bx, 0x0700 ...
这些 汇编源码 (.s / .asm) 必须用 nasm 编译成二进制机器码,才能写入硬盘的第一个扇区(MBR)。
例如你在教程中使用的命令:
nasm -o test mbr.s
它会把 mbr.s 编译成:
-
文件名:test
-
结构:exactly 512 bytes(MBR 启动扇区)
-
格式:raw 二进制机器码(不是 ELF 不是可执行文件)
如果没有 nasm:
nasm -o xxx yyy.asm
-
你的 MBR 程序无法编译
-
dd无法把有效的 512 字节启动代码写入虚拟硬盘 -
Bochs 启动时会直接报错:
"Boot failed: not a bootable disk"这个命令还做了什么?
它会:
-
从 Ubuntu 仓库下载最新稳定版 NASM
-
安装到系统路径
/usr/bin/nasm -
自动加入 PATH
二、下载与解压Bochs源码

在这里我打算先通过百度云网盘下载到windows上,然后通过共享文件夹共享到ubuntu上,但是在ubuntu上的对应共享文件夹中始终找不到目标文件,检查虚拟机的设置中的“选项-共享文件夹”也没问题,重启多次虚拟机也是一样的情况,解决过程在另一个文章中。
三、编译Bochs
1. 进入解压后的源码目录
cd bochs-2.6.8
2. 配置编译选项(启用调试功能)
先安装bochs:

./configure \
--prefix=/home/kanshan/Desktop/bochs \
--enable-debugger \
--enable-disasm \
--enable-iodebug \
--enable-x86-debugger \
--with-x \
--with-x11 \
LDFLAGS='-pthread'
解释以上命令:
1、./configure 在干嘛?
-
Bochs 源码目录里有一个脚本
configure -
运行它就是在 生成 Makefile,决定后面
make时要编哪些文件、开哪些功能、用哪些库 -
你在后面加的这些
--enable-xxx、--with-xxx,就是在对 Bochs 说:“我想开启这些功能,请按这个配置生成 Makefile。”
如果这一步失败,后面 make 基本就没戏。
2、--prefix=/home/kanshan/Desktop/bochs
-
意思是:Bochs 安装到哪个目录
-
后面
make install时,会按照这个前缀,把文件放到:-
可执行文件:
/home/kanshan/Desktop/bochs/bin/bochs -
配置/BIOS 等:
/home/kanshan/Desktop/bochs/share/bochs/...
-
你在自己机器上要改成你自己的路径,比如:
--prefix=/home/easthome/bochs
这样卸载/备份/迁移都很方便,只要删掉这整个目录即可。
3、这些 --enable-xxx 选项是给 OS 开发用的“开挂调试功能”
(1) --enable-debugger
-
启用 Bochs 自带的命令行调试器
-
可以在 Bochs 控制台里输入
b打断点、s单步、x查看内存等
(2)--enable-disasm
-
启用反汇编功能
-
可以在 Bochs 里把内存中的机器码反汇编成 x86 指令,方便你看当前执行到哪条指令
(3)--enable-iodebug
-
启用 I/O 端口调试
-
你之后写操作系统时,会用
in/out操作端口,这个选项能让你观察这些 I/O 行为
(4) --enable-x86-debugger
-
专门针对 x86 架构的调试支持(寄存器、段、中断等更多细节)
总结:这四个就是为了“写 OS 时好调试”开满的调试选项,强烈建议开启。
4、图形界面相关:--with-x、--with-x11
-
告诉 Bochs:
“我要使用 X11 图形界面。”
-
在 Linux 下,Bochs 的窗口(显示你的虚拟屏幕、BIOS 画面)是通过 X11 来显示的
-
没有这两个选项,要么只跑字符界面,要么干脆编译不过去(如果默认没启用)
这也是前面你要安装 xorg-dev 的原因。
5、LDFLAGS='-pthread'
-
传给链接器的参数:使用 pthread(POSIX 线程)库
-
一些功能(比如 GUI、调试器)可能会用到多线程
-
保险起见强制加上
-pthread,避免链接时报缺少线程库
6、放到一句人话里:
这条命令的意思就是:
“请把 Bochs 编译成带图形界面的调试版模拟器,启用所有 x86 调试、反汇编、I/O 调试功能,并把它安装到/home/xxx/bochs这个目录里。”
3. 编译并安装
make
make install
四、配置bochs启动文件
1. 进入安装目录并创建配置文件
cd ..
cd bochs
touch bochsrc.disk
2. 写入 Bochs 配置信息(示例)
megs: 32
romimage: file=/home/.../bochs/share/bochs/BIOS-bochs-latest
vgaromimage: file=/home/.../bochs/share/bochs/VGABIOS-lgpl-latest
boot: disk
log: bochs.out
mouse:enabled=0
keyboard:keymap=/home/.../bochs/keymaps/x11-pc-us.map
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="hd60M.img", mode=flat, cylinders=121,heads=16,spt=63
(以上3个路径按自己机器实际修改)
Ⅴ. 创建虚拟硬盘镜像
1. 使用 bximage 创建硬盘
bin/bximage
按提示依次输入:
1 ← 创建硬盘
hd ← 硬盘类型
flat ← 扁平格式
60 ← 大小(60MB)
hd60M.img
最终生成一个可用于引导的虚拟硬盘文件:
hd60M.img
Ⅵ. 编写并测试 MBR 引导程序
1. 创建 MBR 源文件
touch mbr.s
2. 编写 MBR 汇编代码(示例 Hello World)
(你提供的代码略)
该 MBR 会直接写显存显示 “Hello World!”。
Ⅶ. 汇编并写入虚拟硬盘 MBR 扇区
1. 编译汇编文件
nasm -o test mbr.s
会生成 512 字节的引导扇区文件 test
2. 写入虚拟硬盘的第一个扇区
dd if=/home/.../test of=/home/.../bochs/hd60M.img bs=512 count=1 conv=notrunc
Ⅷ. 启动 Bochs 测试 MBR
1. 进入 Bochs 安装目录
cd bochs
2. 启动模拟器并加载配置文件
bin/bochs -f bochsrc.disk
在这里按一下回车:

3. 在 Bochs 窗口中按 c(continue)启动
看到屏幕显示:
Hello world!
说明 MBR 引导成功。

&spm=1001.2101.3001.5002&articleId=155424230&d=1&t=3&u=0a92517789454c33bbe4b5442c74a9be)
862

被折叠的 条评论
为什么被折叠?



