开启辅助访问 切换到窄版

打印 上一主题 下一主题

Linux上bochs虚拟机的用法

[复制链接]
作者:午夜De凶手 
版块:
嵌入式操作系统 linux 发布时间:2021-1-4 17:25:16
10980
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式
bochs虚拟机,是个CPU模拟器,用于模拟各种型号的CPU的运行状态,是“21天学写操作系统”的必备工具,可以简单模拟一下文章操作系统的启动过程的过程。
它的官网首页长这样,
地址:bochs.sourceforge.net。
现在最新版本是bochs-2.6.11。

下载它的源码包(tar文件),用tar命令解压之后获得源码,然后配置、编译、安装之后就可以使用了。
编译安装的方法与Linux其他源码包差不多,配置项可以打开下图这几个:
x64支持、调试功能、反汇编功能、多核CPU支持。
其中调试和反汇编是必须要打开的,否则没法调自己写的代码。

在bochs源码目录有一个文件.bochsrc,这个是它运行时的配置文件。
文件里有注释,哪一项是做什么的。
如下几张图的红字和绿字是修改的地方。
cpu:配置模拟的CPU信息,其中count是CPU核数,超过1个就是SMP架构。
cpuid:配置CPU指令集信息。

配置从软盘启动,a.img文件是我们制作的虚拟软盘镜像,把它放在bochs源码的根目录下。
把默认的硬盘启动disk改为软盘floppy。
这种玩具系统的代码很少,编译之后不会超过1.44M,使用软盘就行,而且简单。

把硬盘和声卡的配置全注释掉了。

floppy_bootseg_check:表示是否检查第一扇区MBR结尾的0xAA55标志,这里打开它。
然后写一个最简单的引导扇区代码,见下图。
BOOTSEG设置为0x07c0,表示MBR加载的段基址,左移8位就是0x7c00。
这是一段16位汇编,要加.code16。
ljmp,long jmp,长跳转指令,在段间跳转时使用这个指令,段内跳转使用jmp。

常量的引用要加$符号,第13行的跳转是个while(1);死循环,让程序一直停在12、13行。
最后用.org 510设置结尾标志的偏移量,和结尾标志:低位在低字节。高位在高字节,所以55在前,AA在后。
把这些代码放在文件boot.s里,编译成直接二进制文件,也就是除了可执行代码之外没有格式信息、调试信息等额外信息的文件。
先用as编译,然后用objcopy转化为直接二进制文件,最后使用Linux的dd命令传递到软盘镜像文件的第一个扇区(即前512个字节),见下图。
objdump只是为了打印指令信息。

dd的if表示输入文件,input file。
of表示输出文件,output file。
bs是扇区大小512字节。
count是扇区个数,这里只有1个。
在电脑上使用dd命令时,尤其是带着sudo在root权限下时,千万别把of设置到硬盘!!!
bochs -f .bochsrc命令启动前面写的MBR代码,如下是效果图。

bochs的b命令是打断点,与gdb里的用法一样。
c命令是继续运行,与gdb里也一样。
断点打在0x7c00,即MBR的加载地址。
s命令是单步执行一条汇编指令,与gdb里的stepi一样。
现在程序就在那里跳来跳去了。
jmp -2就是while(1);死循环,因为翻译的指令只有2个字节,回跳2个字节就是再执行本条指令,继续回跳继续再执行,就循环起来了。
这篇文章的步骤,应该有很多人讲过的,属于学写操作系统的第一步。
接下来再添加内容,就可以慢慢完善了。
OS还是比编译器容易入门的,没有像语法分析这种纠结的东西,也不需要懂各种图的算法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表