从零开始写操作系统——1.部署工作环境(Bochs + MBR)

参考《操作系统真象还原》这本书,自己写一个轻量级操作系统,本系列博客用于记录本人在开发期间学习到的知识和解决的问题。

首先是第一章,部署工作环境,本人是在VMware上安装的Ubuntu20.04上进行开发,且主要参考该b站教程和其作者的博客,建议把该作者博客和本文章搭配食用。

一、安装必要工具与依赖

在Ubuntu的终端中依次输入以下3条命令。

1. sudo apt install build-essential

📌 作用:安装 C/C++ 编译相关的基础工具链

执行这个命令会安装一组最常用、最基础的软件包,包括但不限于:

工具作用
gccGNU C 编译器
g++GNU C++ 编译器
makeMakefile 构建系统
dpkg-devDebian 编译环境
libc6-devglibc 开发头文件(如 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-devHaskell 语言用的 X11 绑定库

它和 C/C++ 的 X11 开发库 不是一回事

📌 它用于什么?

用于 Haskell 程序 开发 GUI 时调用 X11(比如 Haskell 的图形界面程序)。

📌 和 OS 开发有什么关系?

💥 基本没关系。
这个并不是 Bochs 编译所必需的。

网上某些教程列了它,但实际上是“把所有跟 X11 相关的包都列上了”,而你并不需要 Haskell 的 X11 库。

📌 结论:

不是必须。可以不安装。

你安装失败也没关系,因为你根本不需要它。

3. sudo apt-get install xorg-dev

📌 作用:安装 X11 图形开发环境

xorg-dev 是一个元包,包含:

包名作用
libx11-devX11 核心 GUI 库的开发头文件
libxrandr-dev屏幕分辨率调整相关
libxrender-dev渲染扩展库
libxext-devX11 扩展功能
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 引导成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值