工欲善其事,必先利其器

复制代码
子贡问为仁。子曰:"工欲善其事,必先利其器。居是邦也,事其大夫之贤者,友其士之仁者。"

这样子的解释对不对呢?子贡问孔子如何行仁,孔子说应该先和贤仁者交往。细心的朋友会发现这个比喻是有瑕疵的,毕竟"利器"的前提是把外界看作工具为我所用,但作引申表示"做足准备"就没错------开始实操之前,我们应先准备好所需的资源,部署工作环境。

我们回顾一下之后会用到的大家伙:首先当然是世界顶级编译器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

至此我们的行李箱彻底收拾完了,可以发车了。

相关推荐
心灵宝贝3 小时前
Fedora 38 安装 perl-JSON RPM 包步骤(含依赖问题解决及附安装包)
linux
lilili也3 小时前
Linux——0:安装与配置、命令、gcc
linux
is08154 小时前
全志 H3 armbian 备份
linux·服务器·网络
iconball5 小时前
个人用云计算学习笔记 --18(NFS 服务器、iSCSI 服务器)
linux·运维·笔记·学习·云计算
广药门徒5 小时前
Linux驱动开发与BuildRoot是什么关系与其的应用场景
linux·运维·驱动开发
czhc11400756636 小时前
Linux108 shell:.bashrc 正则表达式:. * .* ^ $ ^$ [ ] [^] ^[] ^[^ ] \< \>
linux·正则表达式
野猪疯驴6 小时前
Linux shell学习(更新中....)
linux·shell
努力学习的小廉6 小时前
深入了解linux网络—— TCP网络通信(下)
linux·网络·tcp/ip
Lu Zelin13 小时前
单片机为什么不能跑Linux
linux·单片机·嵌入式硬件