操作系统课程设计
OS 课设
初始环境搭建
- Linux环境
- Bochs虚拟机
- 一系列工具集
1 | sudo apt-get install build-essential nasm |
其中bochs和vgabios可以进行一键式安装,使用以下命令
1 | sudo apt-get install vgabios bochs bochs-x bximage |
也可以直接在bochs官网上下载。此处建议在官网上下载。官网上下载过后 bochs和vgabios都在解压后的安装包中。bios都在bochs目录下的bios目录中。
Bochs虚拟机使用
首先创建a.img映像
1 | bximage |
然后输入1 回车 fd然后一系列回车,最后得到一个磁盘拷贝的img文件映像
nasm编译后的文件为if处的值,将我们编译的启动程序拷贝到img文件映像中,这里需要加上conv=notrunc,否则会因为boot.bin的大小较小而产生截断。
编写后的文件
1 | dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc |
在编写bochsrc.txt的配置文件的示例
其中romimage和vgaromimage的路径需要修改为实际路径。
floppya修改成实际大小和实际映像。
1 | ############################################################### |
PMTest1
下载 FreeDOS 镜像
- 到 Bochs 官方网站 下载 FreeDOS 镜像。
- 解压后,将其中的
a.img复制到工作目录中,并改名为freedos.img。
生成软盘镜像
- 使用
bximage工具生成一个软盘镜像,命名为pm.img:1
bximage -fd -q -size=1.44 pm.img
- 使用
修改 Bochs 配置文件
- 修改
bochsrc文件,确保包含以下三行:1
2
3floppya: 1_44=freedos.img, status=inserted
floppyb: 1_44=pm.img, status=inserted
boot: a
- 修改
启动 Bochs 并格式化 B: 盘
- 启动 Bochs,等待 FreeDOS 启动完毕。
- 在 FreeDOS 中格式化 B: 盘:
1
format B:
修改代码并重新编译
- 将代码
pmtest1.asm的第 8 行中的07c00h改为0100h, 从而将代码编译成com文件, 便于debug。 - 重新编译代码:
1
nasm pmtest1.asm -o pmtest1.com
- 将代码
将程序复制到虚拟软盘
- 挂载
pm.img到/mnt/floppy:1
2
3
4sudo mkdir -p /mnt/floppy
sudo mount -o loop pm.img /mnt/floppy
sudo cp pmtest1.com /mnt/floppy/
sudo umount /mnt/floppy
- 挂载
在 FreeDOS 中运行程序
- 在 FreeDOS 中执行以下命令:
1
B:\pmtest1.com
- 如果一切正常,屏幕上会显示一个红色的字母“P”如图

- 在 FreeDOS 中执行以下命令:
MyProject
1 | #/bin/bash |
在实现优先级调度的时候 如果想要使用C语言混合编程 那么需要有一个boot.asm然后将我们的展示代码写道Loader中去。
段选择子结构

调试技巧
Bochs调试命令
| 命令 | 功能 |
|---|---|
| b 0x7c00 | 在引导扇区设置断点 |
| c | 继续执行 |
| x /64bx 0x7c00 | 查看内存数据 |
| info gdt | 查看GDT表内容 |
Magic Breakpoint
1 | xchg bx, bx ; Bochs特殊断点 |
常见问题
Q1: 映像文件挂载失败
现象:
1 | mount: /mnt/floppy: wrong fs type... |
解决方案:
1 | sudo apt-get install mtools |
Q2: Bochs启动黑屏
检查点:
- BIOS路径是否正确
- 映像文件是否已正确写入
- GDT设置是否完整
Q3: 保护模式切换失败
调试步骤:
- 检查A20是否开启
- 验证GDT描述符是否正确
- 确认CR0.PE位设置
knowledge
[bits 16]是告诉编译器,下面的代码帮我编译成 16 位的机器码。
[bits 32]是告诉编译器,下面的代码帮我编译成 32 位的机器码。
进入保护模式需要三个步骤。
(1) 打开 A20 。(2) 加载 gdt 。(3) 将 cr0 的 pe 位置 1 。
在保护模式下,要访问 4gb 的内存空间,再采取实模式下的方法是远远不够的,所以段寄存器中存储的数据变成了选择子,其格式如下图所示,其中索引值即 gdt 中索引值,TI 用于指示是去 GDT 还是 LDT 中寻找段基址,RPL 是特权级