1.8 依靠C的世界

操作系统通常是由许多程序员写成的,包括很多部分的大型C(有时是C++)程序。用于开发操作系统的环境,与个人(如学生)用于编写小型Java程序的环境是非常不同的。本节试图为那些有时编写Jave的程序员简要地介绍编写操作系统的环境。

1.8.1 C语言

本部分不是C语言的指南,而是一个有关C和Java之间的关键差别的简要介绍。Java是基于C的,所以两者之间有许多类似之处。两者都是命令式的语言,例如,有数据类型、变量和控制语句等。在C中基本数据类型是整数(包括短整数和长整数)、字符和浮点数等。使用数组、结构体和联合,可以构造组合数据类型。C语言中的控制语句与Java类似,包括if、switch、for以及while等语句。在这两个语言中,函数和参数大致相同。

一项C语言中有的而Java中没有的特点是显式指针(explicit pointer)。指针是一种指向(即包含对象的地址)一个变量或数据结构的变量。考虑下面的语句

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元


char c1,c2,*p;

c1='c';

p=&c1;

c2=*p;


这些语句声明c1和c2是字符变量,而p是指向一个字符的变量(即包含字符的地址)。第一个赋值语句将字符c的ASCII代码存到变量c1中。第二个语句将c1的地址赋给指针变量p。第三个语句将由p指向变量的内容赋给变量c2,这样,在这些语句执行之后,c2也含有c的ASCII代码。在理论上,指针是输入类型,所以不能将浮点数地址赋给一个字符指针,但是在实践中,编译器接受这种赋值,尽管有时给出一个警告。指针是一种非常强大的结构,但是如果不仔细使用,也会是造成大量错误的一个原因。

C语言中没有的包括内建字符串、线程、包、类、对象、类型安全(type safety)以及垃圾回收(garbage collection)等。最后这一个是操作系统的一个“淋浴器塞子”。在C中分配的存储空间或者是静态的,或者是程序员明确分配和释放的,通常使用malloc以及free库函数。正是由于后面这个性质——全部由程序员控制所有内存——而且是用明确的指针,使得C语言对编写操作系统而言非常有吸引力。操作系统从一定程度上来说,实际上是个实时系统,即便通用系统也是实时系统。当中断发生时,操作系统可能只有若干微秒去完成特定的操作,否则就会丢失关键的信息。在任意时刻启动垃圾回收功能是不可接受的。