现在虽然我们已经编译生成了一个应用程序,但却没有办法运行它。其中的道理很简单,我们使用ARM编译器交叉编译生成的可执行程序,自然是只有在ARM硬件环境下才能够使用。
一个最直接的方法,就是使用ARM开发平台。市面上基于ARM的开发板多如牛毛,无论选择哪一款,都可以帮助我们将操作系统运行起来。但很显然,这种方法并不具备可操作性。其中的一个原因是这样将会无端地增加我们的学习成本。另一个原因是,由于各种开发板的芯片选型、电路设计都不尽相同,使用这些开发平台进行开发,我们将会陷入无尽的硬件细节当中,将不能够从宏观的角度去理解操作系统的原理。
为了解决这个问题,我们需要借助一种特殊的软件来运行编译器生成的ARM程序,这就是虚拟机。
虚拟机是运行在PC中的一种软件,能够模拟出ARM硬件环境。这样一来,我们既不必在操作系统的编写和学习过程中多花一分钱,又能拥有一个统一的硬件平台,不至于牵扯过多的硬件细节,迷失到森林之中。
有很多免费的ARM虚拟机可供选择,SkyEye正是其中之一。
SkyEye是一个开源软件项目,其目标是在通用的Linux和Windows平台上实现一个纯软件集成开发环境,模拟常见的嵌入式计算机系统。我们可在SkyEye上运行µClinux以及µC/OS-II、Linux等多种嵌入式操作系统和各种系统软件,并可对它们进行源码级的分析和测试。SkyEye是一个指令级模拟器,可以模拟多种嵌入式开发板,可支持多种CPU指令集,并支持网络、Flash等大量硬件。在SkyEye上运行的操作系统意识不到它是在一个虚拟的环境中运行的。值得一提的是,SkyEye项目是由清华大学的博士后陈先生发起的,是属于我们中国人的优秀软件项目。
与SkyEye类似的虚拟机还有QEMU。从某种程度上说,QEMU较之于SkyEye更加优秀。但是本书最终选择了SkyEye而放弃了QEMU,主要有以下两个原因:
第一,SkyEye易于配置,方便使用。我们可以通过修改配置文件,轻松地搭建出具有任何硬件特性的虚拟平台。
第二,SkyEye对时下比较流行的几款ARM芯片支持良好,如SAMSUNG的s3c系列及ATMEL的AT91系列等。拥有ARM知识基础的读者对这两个系列的芯片应该都有所了解。以这些常用芯片为基础进行操作系统的开发,将有利于为那些只是略懂硬件的读者拨开硬件迷雾,更清晰地看清楚操作系统的全貌。
ARM虚拟机既已选定,接着我们就来了解一下SkyEye的安装与使用。
SkyEye的安装不需要多说,只需要从官方网站上下载SkyEye源代码,然后复制到本地文件夹中,并在命令行中输入相应命令即可。如果以1.2.6_rc1版本为例,那么安装命令如下。
命令1-8
如果是Linux用户,在运行make install命令前可能需要暂时切换到超级用户下,这可以通过命令1-4实现。
由于每个人的系统环境可能会略有差别,我们提供的这种安装方法不能保证一定会成功。即使如此,读者也不用担心,我们已经预先编译好了SkyEye可执行程序,读者也可以去“www.leeos.org”下载。
对于Windows用户,可以将下载下来的“skyeye.exe”文件复制到Cygwin安装目录中的“usr/bin”文件夹下。而对于Linux用户,可以下载skyeye这个文件并复制到“/usr/bin”目录中。这样,ARM虚拟机就安装完成了。
想要使用SkyEye,就必须要了解它的配置方法。skyeye.conf文件是SkyEye的默认配置文件。通过编写合适的skyeye.conf文件,我们可以配置出任何SkyEye支持的硬件环境。
代码1-9是一个比较典型的skyeye.conf配置文件的范例,针对的是s3c2410x这款芯片。
代码1-9
第一行中的关键字cpu记录的是芯片系列,第二行中的mach关键字记录的是芯片的具体型号。
接下来的mem_bank关键字描述的是芯片内存空间特性。其中,map=M代表该段内存空间是一段内存,而如果是map=I,则代表该内存空间对应的是外设端口。type=RW表示的则是该内存空间具备可读写属性。之后的addr=0x30000000和size=0x00800000分别代表内存空间的起始地址和大小,这里,我们将虚拟开发平台配置为拥有8M内存并开始于0x30000000处。后面的file=./leeos.bin表示的是预先要被加载到这段内存空间的映像文件。而boot=yes则表示默认从此处启动。有了这两个属性,在操作系统调试或运行时就不必关心程序的引导,而可以直截了当地去运行了。需要注意的是,mem_back关键字之后的内容需要出现在一行里,由于版面的原因,这里被分成了两行。
关于SkyEye配置文件的写法,我们已经了解,下面介绍它的运行方法。
首先我们需要将代码1-9保存成文件,名为“skyeye.conf”,并放到某一个文件夹下。其次,需要将编译完成的二进制映像文件放到同一个目录下,这个二进制文件的名字应该与skyeye.conf文件中记录的文件名相一致。最后,只需要开启一个命令行,输入skyeye命令,程序就可以运行了。整个过程如图1-14所示。
图1-14 SkyEye的使用方法
最后还要强调,本书所有的示例代码都是运行在由SkyEye模拟的s3c2410这一硬件平台,原因就像前面介绍的,s3c2410在国内比较流行,了解的人较多。同时,SkyEye对这一平台的支持也非常成熟且资源丰富,这些对操作系统的开发都非常有利。如果读者对其他平台有所了解,将本书的例子代码移植过去也不是什么难事。