购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2 开发工具的使用

自己动手写操作系统的第二个重要工作是选择合适的编译器和编辑器。

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

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

命令1-2

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

命令1-3

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

命令1-4

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

命令1-5

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

1.2.2 编辑器的选择和使用

编译器已经有了,我们需要使用什么工具来编写操作系统代码呢?

其实,只要自己觉得合适,无论是使用简单的(诸如记事本之类的)工具还是复杂的(诸如进行程序开发的专用IDE),都不会有问题,每个人心中应该都有自己最理想的编辑工具。在程序的开发过程中,我们只需要打开一款编辑器,将程序源代码敲进去,然后将这些内容保存成源文件,那么剩下的工作就是使用编译器对这些代码进行编译。

接下来,让我们通过Windows下的“记事本”这一工具来演示一下在Cygwin环境中编写代码的一般方法,其他代码编辑器的使用与该方法类似。

首先请打开文本编辑器,向里面输入一个空的main函数,如图1-11所示。

图1-11 使用编辑器编写代码

接下来我们尝试对这段代码进行编译。将这些内容保存成文件,取名为“test.c”。在Cygwin的安装目录下,有一个“home”文件夹,进入这个文件夹,可以看到以用户名命名的一个文件夹,该文件夹代表Cygwin用户的家目录。所有个人私有的文件和数据存放到这个目录中是比较合适的。

例如,某个人将Cygwin安装到了C盘根目录,同时他又是以Administrator用户登录的话,那么这个文件夹就应该是C:\Cygwin\home\Administrator。

保存完成后,运行Cygwin,并在弹出的命令行中输入“ls”这条命令,可以看到test.c文件出现在该目录下,如图1-12所示。

图1-12 在Cygwin命令行运行“ls”命令

紧接着就在这个命令行下,运行编译工具,将“test.c”文件编译成可执行程序,命令如下。

命令1-6

最终在该目录下,会出现一个名为“a.out”的文件,这个文件正是由GCC编译test.c文件后生成的。这就表示我们已经使用编辑器编写了代码,并用编译器成功编译了第一个程序。

对GCC比较熟悉的读者可能会觉得命令1-6这种编译方法比较奇怪。如果您使用的是我们提供的专用编译器,那么“-nostdlib”参数是必需的。它表示编译时不去链接标准函数库。相关参数的具体含义,我们会在接下来的章节中详细阐述。

如果是Linux用户,那么程序的编写和编译过程会更简单些。因为在Linux下,存在有一些基于命令行的文本编辑器,如vi。使用这样的一些编辑器,程序的编写、代码的保存和编译等过程都可以在命令行下实现,这样,开发效率会较高。

如果一些Linux初学者觉得vi较难掌握,也可以尝试使用nano。nano也是一个在命令行下就能运行的文本编辑器,它的用法像Windows下的“记事本”一样简单,图1-13是一个在Linux下运行nano的页面。

图1-13 nano运行页面

在确保系统中安装了nano工具的前提下,想要使用nano,只需要首先通过cd命令切换到某一路径下,然后运行下面的命令。

命令1-7

这样就可以打开一个test.c文件,并进入文本编辑的页面中了。在写入适当的内容之后,按下“Ctrl+O”组合键可以保存文件,按下“Ctrl+X”组合键可以退出页面。

如果有些朋友还是觉得使用图形化的工具更加方便,那么,在Linux下,也有很多图形化的文本编辑器可供选择,如gedit、gvim、mousepad,等等。这些工具的使用方法与Windows下的编辑工具完全一致。最终我们还是要通过命令行来编译源程序。 r0iHLea+LZXqwAlIFYhUb7f73c2eF5iHYsEfQk8g32KBIjoIbffp4GJlG8JbjFyh

点击中间区域
呼出菜单
上一章
目录
下一章
×