本帖内容摘自Linux内核设计与实现 (第三版),像大神 Robert Love致敬
从Unix的历史视角来认识linux内核与Linux操作系统的前世今生。今天Unix系统业已演化成一个具有相似应用程序编程接口(API),并且基于相似设计理念的操作系统家族。但他又是一个别具特色的操作系统,从萌芽到现在已经有四十余年的历史。若要了解Linux,我们必须首先认识Unix系统。
1.1 Unix的历史
Unix虽然已经使用了四十年,但计算机科学家仍然认为他是现存操作系统中最强大和最优秀的操作系统。从1969年诞生以来,有丹尼斯里奇和肯汤姆森的灵感火花点亮的这个Unix产物已经成为一种传奇,他历经了时间的考研依然声名不坠。
Unix是从贝尔实验室的一个失败的多用户操作系统Multics中涅槃而生的。Multics项目被终止后,贝尔实验室计算科学研究中心的人们发现自己处于一个没有交互式操作系统可用的境地。在这种情况下,1969年的夏天,贝尔实验室的程序员们设计了一个文件系统原型,而这个原型最终发展演化成了Unix。肯汤姆森首先在一台无人问津的PDP7机上实现了这个全新的操作系统。1971年,Unix被移植到PDP11机中。1973年,整个·unix操作系统用C语言进行了重写,正是当时这个并不太引世人瞩目的举动,给后来·Unix系统的广泛移植铺平了道路。
许多其他公司也把·unix移植到新的机器上。伴随着这些移植,开发者们按照自己的方式不断地增强系统的功能,并由此产生了若干变体。1977年,贝尔实验室综合各种变体推出了Unix System3。
由于·unix系统设计简洁并且在发布时提供源代码,所以许多其他组织和团体都对它进行了进一步的开发。加州大学伯克利分校便是其中影响最大的一个。他们推出的变体角Berkeley Software Distributions。伯克利的第一个Unix演化版是1977年推出的IBSD系统,他的实现基于贝尔实验室的Unix版本,不但在其中加入了许多修正补丁,而且还集成了不少额外的软件;1978年伯克利继续推出了2BSD系统,其中包含我们如今仍在使用的csh‘、vi等应用软件。而伯克利真正独立开发的Unix系统是于1979年推出的3BSD系统,该系统引入了一系列令人振奋的新特性,支持虚拟内存便是其中一大亮点。在3BSD以后,伯克利又相继推出了4BSD系列等众多分支。这些Unix演化版实现了任务管理、换页机制、TCP ip等新特性。最终伯克利大学在1994年重写了虚拟内存子系统,病推出了伯克利Unix系统的最终官方版,即我们树脂的4.4BSD。
由于最初一流的设计和以后多年来的创新和逐步提高,·Unix系统成为一个强大、健壮和稳定的操作系统。下面的几个特点是时Unix强大的根本原因。首先,Unix很简洁:不想其他动辄提供数千个系统调用并且设计的不明确的系统,Unix仅仅提供几百个系统调用并且有一个非常明确的设计目的。第二,在Unix中,所有的东西都被当做文件对待。这种抽象使对数据和对设备的操作时通过一套相同的系统调用接口来进行的:open、read、write、lseek和close。第三,·unix的内核和相关的系统工具软件使用C语言编写而成正是这个特点使得Unix在各种硬件体系架构面前都具备令人惊异的移植能力,并且使广大的开发人员很容易就能接受它。第四,·Unix的进程创建非常迅速,并且有一个非常独特的fork系统调用。最后,Unix提供了一套非常简单但那又很稳定的进程间通信元语,快速简洁的进程创建过程使Unix的程序把目标放在一次执行保质保量地完成一个任务上,而简单稳定的进程间通信机制又可以保证这些单一目的的简单程序可以方便地组合在一起,去解决现实中变得越来越复杂的任务。正是由于这种策略和机制分离的设计理念,保证了Unix系统具备清晰的层次化结构。
今天,·unix已经发展成为一个支持抢占式多任务,多线程,虚拟内存,换页,动态链接和TCP网络的现代化操作系统。Unix的不同变体被应用在大到数百个CPU的集群,小到嵌入式设备的各种系统上。尽管Unix已经不再被认为是一个实验室项目了,但他仍然伴随着操作系统设计技术的进步而继续成长,人们仍然可以把它作为一个通用的操作系统来使用。
Unix的成功归功于其简洁和一流的设计。他能拥有今天的能力和成就应该归功于丹尼斯里奇和肯汤姆森和其他早期设计人员的最初决策,同时也要归功于那些永不妥协于成见,从而赋予Unix 无穷活力的设计抉择。
1.2 追寻Linus足迹:Linux简介
1991年,Linus Torvalds为当时新推出的、使用Intel 80386微处理器的计算机开发了一款全新的操作系统,Linux由此诞生。那时,作为芬兰赫尔辛基大学的一名学生Linus,正为不能随心所欲使用强大而自由的Unix系统而苦恼。对Torvalds而言,使用当时流行的微软的·dos系统,除了玩波斯王子游戏外,别无它用。Linus热衷于Minix,一种教学用的廉价Unix,但是,他不能轻易修改和发布该系统的源代码(由于Minix的许可证),也可能对Minix开发者多做的设计轻举妄动,这让他耿耿于怀并由此对作者的设计理念感到失望。
·linus像任何一名生机勃勃的大学生一样决心走出这种困境:开发出自己的操作系统。他开始写了一个简单的终端仿真程序,用于连接到本校的大型Unix系统上。他的终端仿真程序经过一学年的研发,不断改进和完善。不久,Linus手上就有了虽不成熟但五脏俱全的Unix。1991年年底,他在Internet上发布了早期版本。
Linux是类Unix系统,但他不是Unix。需要说明的是,尽管Linux借鉴了Unix的许多设计并且实现了Unix的API,但Linux没有像其他的Unix变种那样直接使用unix的源代码。必要的时候,他的实现可能和其他各种Unix的实现大相径庭,但他没有抛弃Unix的设计目标并且保证了应用程序接口的一致。
1.3 操作系统和内核简介
由于一些先行商业操作系统日趋庞杂机器设计上的缺陷,操作系统的精确定义并没有一个统一的标准。许多用户把他们在显示屏上看到的东西理所当然地认为就是操作系统。操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分。这些部分应该包括内核、设备驱动程序、启动引导程序、命令行shell或者其他种类的用户界面、基本的文件管理工具和操作系统。这些都是必不可少的东西---所以别以为只要有浏览器和播放器就行了。系统这个词其实包含了操作系统和所有运行在它之上的应用程序。
本文的重点是内核,内核才是操作系统的内在的核心。系统其他部分必须依靠内核这部分软件提供的服务,像管理硬件设备、分配系统资源等。内核有时候被称作是管理者或者是操作系统核心。通常一个内核由负责相应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。对于提供保护机制的现代系统来说,内核独立于普通应用程序,他一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。这种系统态和被保护起来的内存空间,统称为内核空间。相对的,应用程序在用户空间执行。他们只能看到允许他们使用的部分系统资源,并且只使用某些特定的系统功能,不能直接访问硬件,也不能访问内核划给别人的内存范围,还有其他一些使用权限。当内核运行的时候,系统以内核态进入内核空间执行。而执行一个普通用户程序时,系统将以用户态进行以用户空间执行。
在系统中运行的应用程序通过系统调用来与内核通信。应用程序通常调用库函数再由库函数通过系统调用界面,让内核代其完成各种不同任务。一些库调用提供了系统调用不具备的许多功能,在那些较为复杂的函数中,调用内核的操作通常只是整个工作的一个步骤而已。当一个应用程序执行一条系统调用,我们说内核正在代其执行。如果进一步解释,在这种情况下,应用程序被称为通过系统调用在内核空间运行,而内核被称为运行于进程上下文中。这种交互关系---应用程序通过系统调用界面陷入内核---是应用程序完成其工作的基本行为方式。