代码、内容参考来自于包括《操作系统真象还原》、《一个64位操作系统的设计与实现》以及《ORANGE’S:一个操作系统的实现》。
1.虚拟机配置
为了后面更好操作,我们在ubuntu中操作
使用你习惯的虚拟机安装即可
下载GCC
sudo apt update
安装 GCC 和必要的构建工具
sudo apt install build-essential
验证 GCC 安装是否成功
gcc --version
2.Bochs配置
Bochs 主要用于模拟 x86 架构的计算机系统,这是我们的操作系统最终的宿主机。
下载地址:https://sourceforge.net/projects/bochs/files/bochs/2.8/bochs-2.8.tar.gz/download
然后上传到ubuntu上
跳转到下载目录
解压
tar -zxvf bochs-2.8.tar.gz
运行configure脚本,其中–prefix是要安装的目录
sudo ./configure --enable-debugger --enable-disasm --prefix=/bochs --enable-iodebug --enable-x86-debugger --with-x --with-x11
编译
make
编译安装
make install
然后切换到/bochs目录
在bin目录下执行bximage
sudo ./bximage
第一个选择 1,即创建新的硬盘或者软盘
第二个选择 hd,即创建硬盘
第三个选择 flat,即创建flat格式的硬盘,还有一些诸如sparse, growing, vpc or vmware4格式的硬盘。
第四个选择 512,即一个扇区有512字节
第五个选择 60,即硬盘的大小为60MB
第六个选择dreams.img,这个是硬盘的名字

当前目录下就会生成dreams.img文件
同样在bin目录下新建一个启动文件 bochsrc.disk
# 设置内存为32MB megs: 32 # 设置对应机器的BIOS romimage: file=/bochs/share/bochs/BIOS-bochs-latest # 设置对应机器的VGA BIOS vgaromimage: file=/bochs/share/bochs/VGABIOS-lgpl-latest # 选择启动盘符,默认为从软盘启动,但是这里设置为硬盘,软盘太古老了 boot: disk # 设置日志文件的输出 log: bochs_out.log # 关闭鼠标功能,打开键盘功能,并且设置键盘的映射 mouse: enabled=0 keyboard: keymap=/bochs/share/bochs/keymaps/x11-pc-us.map # 硬盘设置 ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 ata0-master: type=disk, path="/bochs/bin/dreams.img", mode=flat
其中的大部分设置都做了详细的注释,这里我们对硬盘部分做出一些更详细的解释
- enabled=1:表示 ATA0 控制器被启用。这意味着 Bochs 将会模拟一个 ATA0 控制器,并允许虚拟机使用这个控制器来访问硬盘或光驱设备。
- ioaddr1=0x1f0:表示 ATA0 控制器的 I/O 端口地址。在计算机体系结构中,I/O 端口用于与外部设备进行数据交换。这里指定了 ATA0 控制器的主要 I/O 端口地址为 0x1f0。
- ioaddr2=0x3f0:表示 ATA0 控制器的备用(secondary)I/O 端口地址。有些设备可能需要额外的 I/O 端口进行通信,这里指定了 ATA0 控制器的备用 I/O 端口地址为 0x3f0。
- irq=14:表示 ATA0 控制器的中断请求线(IRQ)。中断请求线用于处理硬件设备发出的中断信号,这里指定了 ATA0 控制器的中断请求线为 14。
同样在bin目录下执行,注意这里不能使用远程连接工具执行
./bochs -f bochsrc.disk
在bochs的命令行中先输入 6,即开始仿真
在输入 c,即开始执行

系统提示没有可引导的启动设备,也就是我们设置的硬盘是一个空的硬盘,里面并没有程序可以执行,所以直接报错退出了。
3.nasm
我们之前的nasm在linux可以直接使用apt下载
sudo apt-get install nasm
4.代码迁移
接下来就是把我们之前的代码复制到ubuntu里

编译mbr和Loader
nasm -I common/ -o bin/mbr.bin asm/mbr.asm nasm -I common/ -o bin/Loader.bin asm/Loader.asm
复制mbr二进制程序到硬盘:
bs=512 表示每次读写的字节数是 512 字节。 count=1 表示只写入一个扇区的内容。 conv=notrunc 表示不截断 dreams.img 文件,即保留文件的现有内容并在其上写入新的内容。
sudo dd if=bin/mbr.bin of=/bochs/bin/dreams.img bs=512 count=1 conv=notrunc sudo dd if=bin/Loader.bin of=/bochs/bin/dreams.img bs=512 count=1 seek=2 conv=notrunc
执行
sudo /bochs/bin/bochs -f /bochs/bin/bochsrc.disk

5.参考
郑钢著操作系统真象还原
田宇著一个64位操作系统的设计与实现
丁渊著ORANGE’S:一个操作系统的实现


