1.1 从hello world开始
操作系统也是软件,也是由一大堆程序组成的,所以不要觉得它多么神秘。既然是程序,我们就要知道它是干什么的以及为什么需要,笔者想用大多数人写的第一个程序——“hello,world!!”来描述这个原因。当然这个程序是用C语言写的。大致过程如图1-1所示。
图1-1 hello,world!!程序的生成过程
这个程序正常运行后,会在屏幕上输出hello,world!!这个字符串。显然这个程序中最重要的是printf函数,然而我们并没有实现它。如果你能发现这一点,并迫切地想知道它究竟在背后干了些什么,那说明你和笔者一样有着对问题追根溯源的性格。这个也是我们研究问题本相的原动力。
那么printf在哪儿呢?都干了些什么呢?
它就在应用程序库中,代码虽然没有实现它,但库中实现了,程序链接器最终把它和代码链接装配在一起,这样程序也就能正确工作了,如图1-2所示。
图1-2 hello,world!!程序的链接过程
实际中可能有差异,可能printf不是在单独的库中,也可能不只是链接这一个库就行了。但是道理都一样。
printf函数把程序传给它的“hello,world!!”字符串数据复制到一个内存缓冲区中,然后调用操作系统提供的API(应用程序编程接口)函数。可能不同的实现之间有差异,但是大致动作如图1-3所示。
图1-3 printf函数的逻辑工作机理
一旦调用操作系统API,代码的控制权就交给了操作系统,执行的也是操作系统的代码。至于实现这一机制的进程,后面的章节会详细讨论。操作系统会根据不同的API函数以及应用程序传递进来的参数完成不同的动作和功能。比如,程序中的printf、调用的API和传递的参数,是要告诉操作系统把它缓冲区中的数据写入标准输出设备上。于是我们在屏幕上就看到了hello,world!!,然后程序就逐层返回到main函数,最后main函数退出,这个小程序也就结束了。下面用图1-4来描述这一过程。
图1-4 hello,world!!程序调用操作系统API的过程
由图1-4可知,真正操控计算机硬件完成显示hello,world!!的是操作系统这个软件。是它在背后默默地工作着。当然它的功能并不只是操控计算机硬件,我们后面会慢慢讨论。
现在来看看没有操作系统能完成这个hello,world!!的程序吗?有!只是我们要做的工作多了很多,我们得亲自实现printf函数、完成控制计算机硬件的程序,并且还要求计算机内部这时只运行这一个应用程序,因为有些硬件同一时间只能被一个程序使用,如图1-5所示。
图1-5 裸机hello,world!!程序
写上面这样的程序可能对程序员的要求有点高,因为必须要知道计算机硬件的每个细节,否则程序不会出现正常的结果。好吧,我们还是应该承认这个世界存在这种编程高手。
关于hello,world!!这个程序,我们就说到这里。如果没有操作系统,无论开发程序还是运行程序,难度都会很高。
现在去看看先辈是如何一步一步创造出操作系统的。