一直想写写Linux内核的文章,特别是进程这方面的,说实话,不好写,也不太敢写:)直到遇到了一本好书。《Linux内核设计与实现》,原书《Linux Kernel Development》Third Edition,作者Robert Love。
在之前买了几本厚书,比如《深入理解Linux内核》、《深入理解计算机系统》,对于我而言还是太厚了。前者主要看了文件系统的一些知识,后者主要看内存管理的一些知识。
但是于我而言,最爱还是《Linux内核设计与实现》。给个大写的赞,读起来很让人兴奋的那种。本书只有335页,基本上不到上面两本书的一半,但是却很接地气。因为作者是Linux内核开发人员,有丰富的内核开发经验,而且是一位80后,语言简洁幽默。所以该书比前面两者少了五分理论,多了五分实践。值得一看。当然上面的书也可以加深理解Linux内核。
首先,什么是操作系统,没有统一标准。书上的定义,操作系统是指在整个系统中负责完成最基本功能和系统管理功能的那些部分。这些部分应该包括内核、设备驱动程序、启动引导程序、命令行Shell或者其他种类的用户界面、基本的文件管理工具和系统工具。
而系统则是指包含了操作系统和所有运行在它之上的应用程序。
所以,内核可以称作操作系统核心或者管理者。如下图所示,应用系统、内核和硬件的关系。
事实上该图中,显示了更多的关系。首先我们说一个系统分为三大层次,最底下是硬件,中间是内核空间,最上面是用户空间。
我们普通的应用程序一般运行在用户态,也就是一般用户能见到的。但是在实际运行过程中,它需要使用硬件资源,例如可能需要计算用到CPU,需要写文件用到硬盘和内存,显示在屏幕上同样需要内存还有终端。那怎么访问这些硬件的,其中的原理是什么。这些都是中间的内核空间需要完成的事情,如果一个应用程序切换到内核空间运行,就处于内核态。
用户态到内核态的切换往往通过系统调用接口来实现,而一般在系统调用接口之上还会封装成标准的库函数,例如C或者C++库。
上面提到的硬件是各种物理设备,事实上,都需要有相应的驱动程序管理,例如硬盘、键盘、鼠标、显示器等等。这些设备和驱动如何管理呢,内核子系统管理大部分,有一小部分直接封装成系统调用接口。内核与硬件设备之间往往提供了中断机制。
我们上面提到的程序,在一般操作操作系统中,也被称为进程。我们再把上面的描述进行归纳。
Linux内核有两大虚拟机制
- 内存管理,内存空间的虚拟化
- 进程管理,CPU时间的虚拟化
所以运行一个程序会自以为拥有了所有的内存和处理器资源。
Linux内核有两大基本抽象概念
- 文件,Linux下一切皆文件
- 进程,运行中的程序
如果说前者是静态的抽象,那么后者就是动态的抽象。
Linux内核有四大服务
-
中断服务,响应硬件设备的中断提供中断机制。与进程无关,在专门的中断上下文中运行。
-
进程管理与调度,管理多个进程以及如何分享处理器时间。
-
内存管理,管理进程地址空间。
-
网络、进程间通信,多个进程之间以及进程与外界如何通信。
Linux内核空间有两大上下文
- 进程上下文,代表某个特定的进程执行。
- 中断上下文,与任何进程无关,处理某个特定的中断。
我们一般对Linux内核的理解在于进程管理和虚拟内存的管理,而对中断服务会有些陌生,更不知道中断上下文。而此书非常清晰的介绍了中断服务和中断机制,以及中断上下文。简单概括的话,中断服务是专门针对硬件设备的,是设备驱动程序开发一定需要考虑的,是必须及时得到响应的不能像进程可以睡眠的,但是中断可以被另外的中断打断,所以有了中断上下文。中断也不能说完全不能睡眠,中断处理又可以分为两部分:上、下半部,前面说的及时响应放在上半部,而可以延迟执行的放在下半部,所以,下半部也可以睡眠。所以它对应的机制又稍有不同,和进程管理的机制又有些接近。
对于进程管理、进程调度和进程上下文,后续文章将详细介绍。所以对中断和中断处理的一些概念只是在这里提一下。如果是设备驱动开发的,建议看看本书。
ps:对文件系统和虚拟内存本人之前有不少文章进行了介绍,必要时再进行补充。