0%

在第7章中,我们讨论了内核为处理中断而提供的中断处理程序机制。中断处理程序是内核中很有用的部分。但是,由于本身存在一些局限,所以它只能完成整个中断处理流程的上半部分。这些局限包括:

  1. 中断处理程序以异步方式执行,并且它有可能打断其他重要代码(甚至包括其他中断处理程序)的执行。因此,为了避免被打断的代码停止时间过长,中断执行程序应该执行得越快越好。
  2. 如果当前有一个中断处理程序正在执行,在最好的情况下(如果IRQF_DISABLED没有被设置),与该中断同级的其他中断会被屏蔽,在最坏的情况下(如果IRQF_DISABLED有被设置),当前处理器上所有其他中断都会被屏蔽。因为禁止中断后硬件与操作系统无法通信,因此,中断处理程序执行得越快越好。
  3. 由于中断处理函数往往需要对硬件进行操作,所以它们通常有很高的时限要求。
  4. 中断处理程序不在进程上下文中运行,所以它们不能阻塞。这限制了它们所做得事情。

现在,为什么中断处理程序只能作为整个硬件中断处理流程一部分的原因就很明显了。操作系统必须有一个快速、异步、简单的机制负责对硬件做出迅速响应并完成那些时间要求很严格的操作。中断处理程序很适合于实现这些功能,可是,对于那些其他的、对时间要求相对宽松的任务,就应该推后到中断被激活以后再去运行。
这样,整个中断处理流程就被分为了两个部分,或叫两半。第一个部分是中断处理程序(上半部),就像我们在第7章讨论的那样,内核通过对它的异步执行完成对硬件中断的即时响应。在本章中,我们要研究的是中断处理流程中的另外那一部分,下半部(bottom halves)。

阅读全文 »

任何操作系统内核的核心任务,都包含对连接到计算机上的硬件设备进行有效管理,如硬盘、蓝光碟机、键盘、鼠标、3D处理器,以及无线电等。而想要管理这些设备,首先要能和它们互通音信才行。众所周知,处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器向硬件发出一个请求,然后专门等待回应的办法,显然差强人意。既然的硬件响应这么慢,那么内核就应该在此期间处理其他事务,等待硬件真正完成了请求的操作之后,再回过头来对它进行处理。
那么到底如何让处理器和这些外部设备能协同工作,且不会降低机器的整体性能呢?轮询(polling)可能会是一种解决办法。它可以让内核定期对设备的状态进行查询,然后做出相应的处理。不过这种方法很可能会让内核做不少无用功,因为无论硬件设备是正在忙碌着完成任务还是已经大功告成,轮询总会周期性地重复执行。更好的办法是由我们来提供一种机制,让硬件在需要的时候再向内核发出信号。这就是中断机制。在本章中,我们将先讨论中断,进而讨论内核如何使用所谓的中断处理函数处理对应的中断。

阅读全文 »

本章将介绍几种Linux内核常用的内建数据结构。和其他很多大型项目一样,Linux内核实现了这些通用数据结构,而且提倡大家在开发时重用。内核开发者应该尽可能地使用这些数据结构,而不要搞自作主张地山寨方法。在下面的内容中,我们讲述这些通用数据结构中最有用的几个。

  1. 链表
  2. 队列
  3. 映射
  4. 二叉树

最后还要讨论算法复杂度,以及何种规模的算法或者数据结构可以相对容易的支持更大的输入集合。

阅读全文 »

在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口。这些接口让应用程序受限地访问硬件设备,提供了创建新进程并与已有进程进行通信的机制,也提供了申请操作系统其他资源的能力。这些接口在应用程序和内核之间扮演了使者的角色,应用程序发出各种请求,而内核负责满足这些请求(或者无法满足时返回一个错误)。实际上提供这些接口主要是为了保证系统稳定可靠,避免应用程序恣意妄为。

阅读全文 »

第3章讨论了进程,它在操作系统看来是程序的运行态表现形式。本章将讨论进程调度程序,它是确保进程能有效工作的一个内核子系统。
调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间。进程调度程序(常常简称调度程序)可看作在可运行态程序之间分配有限的处理器时间资源的内核子系统。调度程序是像Linux这样的多任务操作系统的基础。只有通过调度程序的合理调度,系统资源才能最大限度的发挥作用,多进程才会并发执行的效果。
调度程序没有太复杂的原理。最大限度地利用处理器时间的原则是,只要有可以执行的进程,那么总会有进程正在执行。但是只要系统中可运行的进程的数目比处理器的个数多,就注定某一给定时刻会有一些进程不能执行。这些进程在等待运行。这一组处于可运行状态的进程中选择一个来执行,是调度程序所需完成的基本工作。

阅读全文 »

本章引入进程的概念,进程是Unix操作系统抽象概念中最基本的一种。其中涉及进程的定义以及相关的概念,比如线程;然后讨论Linux内核如何管理每个进程:它们在内核中如何被列举,如何创建,最终又如何消亡。我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在,Linux也不例外。

阅读全文 »

在这一章,我们将介绍Linux内核的一些基本常识:从何处获取源代码,如何编译它,又如何安装新代码。那么,让我们考察一下内核程序与用户应用空间程序的差异,以及内核中所使用的通用编程结构。虽然内核在很多方面有其独特性,但从现在来看,它和其他大型软件项目并无多大差别。

阅读全文 »

这一章将带我们从Unix的历史视角来认识Linux内核与Linux操作系统的前世今生。今天Unix系统业已演化成一个具有相似应用程序编程接口(API),并且基于相似设计理念的操作系统家族。但它又是一个别具特色的操作系统,从萌芽至今已经有40余年的历史。若要了解Linux,我们必须首先认识Unix系统。

阅读全文 »