一步步写嵌入式操作系统
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.1 编译器的选择和安装

由于我们的操作系统需要运行在ARM体系结构中。因此,在琳琅满目的ARM编译器中选择出一款,用来编译操作系统源程序,就成为了必须先要解决的问题。于是我们选择了GCC。

GCC的大名,相信读者应该都会如雷贯耳。简单地说,GCC就是由GNU基金会组织开发的一套开源的编译器。根据相关许可,我们可以自由地下载和使用这套编译器,可以随意地修改和重新发布它的源代码,整个过程不需要付一分钱或承担任何责任。这就是我们选择GCC作为开发工具的一个最主要的原因。

GCC的免费获得和使用并不等于质量低劣或功能欠缺。它的功能不逊于任何一款商用ARM编译器。这也是我们选择GCC作为操作系统开发工具的第二个原因。

接下来我们就来介绍一下GCC编译器的安装过程。

GCC是源码开放的,所以理论上,我们完全可以去网站上下载GCC源代码,然后在本地进行编译,生成一个能够编译ARM体系结构下程序的工具。

这个过程听起来似乎轻而易举,但做起来却没有那么容易。况且也没有太大的必要自己生成编译器。因此,本书不会对这一部分内容进行介绍。如果读者确实对自己构建编译器很感兴趣,可以去“www.leeos.org”上翻阅相关文档。

其实,这个问题远远没有那么复杂。编译器也只不过是一套软件而已,别人编译好的,拿到我们的系统中一样可以使用。

通常我们会看到网上有许多名为“arm-Linux-gcc”或“arm-elf-gcc”的编译工具。使用这些工具来编译属于我们自己的操作系统,基本上都是可以的。

读者也许会提出这样的疑问,为什么这些编译器的名字有些与众不同呢?其实,这些编译器的命名方法有些约定俗成的规矩,例如,开头的“arm”关键字表示该编译器将生成ARM体系结构机器码,而中间的“Linux”或“elf”则表示应用的目标平台。一般说来,“Linux”关键字意味着该编译器在编译时针对Linux系统做了特定的优化,生成的代码将更好地运行在Linux系统之中,而“elf”关键字则更适合生成通常的可执行程序代码。对于我们自己的操作系统来说,使用“arm-elf-gcc”这套工具显然更合适一些。与传统的PC程序开发不同,嵌入式的开发过程通常都是在PC中对源代码进行编译,再将编译生成的可执行程序放到嵌入式平台中去运行,因此有人把这种编译过程称作交叉编译或跨平台编译,而将一整套用于交叉编译的工具称为交叉编译工具链。

为了方便读者对本书代码进行实践,我们制作好了一套专门用于这套操作系统的编译器,大家可以去“www.leeos.org”网站上下载使用。

需要注意的是,这样的一套编译工具只能用来编译我们自己写的操作系统,不能保证编译其他ARM应用程序的正确性,包括Linux下的程序和内核。这是因为在制作这套工具的过程中,为了能让编译器尽可能小一些,我们没有添加任何标准C函数库和其他一些GCC扩展工具,对于我们自己的操作系统来说,这样做并无问题。也就是说,通常情况下,一个操作系统的核心代码并不需要第三方函数库,但这个假设对于绝大多数应用程序来说却并不成立。

当下载到某一个版本的交叉编译工具之后,第一步要做的就是将其解压。以我们所提供的交叉编译工具链为例,Windows用户可以运行如下命令。

命令1-1

   tar zxvf leeos_tools_for_Cygwin.tar.gz

当然这需要首先将下载的编译工具复制到某一目录中,如果读者将Cygwin安装到了C盘的话,这个目录可以是“C:\Cygwin\usr”,然后打开Cygwin命令行,运行下面的命令。

命令1-2

   cd /usr

这样,我们就可以使用命令1-1,将安装工具解压到“usr”目录下。此时虽然解压过程已经完成,但并不表示编译器已经可以使用,我们还需运行如下命令才能将编译器彻底地安装到系统中。

命令1-3

   echo "PATH=\$PATH:/usr/leeos_tools_for_Cygwin/bin">>/etc/profile

对于Linux用户,步骤基本是一样的。但需要注意的是这些命令需要以超级用户的身份去运行。使用命令1-4可以进行超级用户的切换。

命令1-4

   su

使用su命令后,终端会提示输入超级用户密码。用户切换完成后,就可以使用cp命令将下载的编译工具复制到“/usr”目录中。

命令1-5

   cp /where/your/compiler/locate/leeos_tools_for_Linux.tar.gz /usr

接下来运行命令1-2,然后是命令1-1和命令1-3。注意,要将“leeos_tools_for_Cygwin”改成“leeos_tools_for_Linux”。重启系统后,交叉编译工具就可以使用了。