Linux 核心--12.Linux内核机制

第十一章 核心机制

本章主要描叙Linux核心为使核心其他部分能有效工作而提供的几个常用任务与机制 。


11.1底层部分处理机制





图11.1 底层部分处理机制数据结构

某些特殊时刻我们并不愿意在核心中执行一些操作 。例如中断处理过程中 。当中断发生时处理器将停止当前的工作, 操作系统将中断发送到相应的设备驱动上去 。由于此时系统中其他程序都不能运行, 所以设备驱动中的中断处理过程不宜过长 。有些任务最好稍后执行 。Linux底层部分处理机制可以让设备驱动和Linux核心其他部分将这些工作进行排序以延迟执行 。图11.1给出了一个与底层部分处理相关的核心数据结构 。

系统中最多可以有32个不同的底层处理过程;bh_base是指向这些过程入口的指针数组 。而bh_active和 bh_mask用来表示那些处理过程已经安装以及那些处于活动状态 。如果bh_mask的第N位置位则表示bh_base的 第N个元素包含底层部分处理例程 。如果bh_active的第N位置位则表示第N个底层处理过程例程可在调度器认 为合适的时刻调用 。这些索引被定义成静态的;定时器底层部分处理例程具有最高优先级(索引值为0), 控制台底层部分处理例程其次(索引值为1) 。典型的底层部分处理例程包含与之相连的任务链表 。例如 immediate底层部分处理例程通过那些需要被立刻执行的任务的立即任务队列(tq_immediate)来执行 。

有些核心底层部分处理过程是设备相关的,但有些更加具有通用性:


TIMER
每次系统的周期性时钟中断发生时此过程被标记为活动,它被用来驱动核心的定时器队列机制 。
CONSOLE
此过程被用来处理进程控制台消息 。
TQUEUE
此过程被用来处理进程tty消息 。
NET
此过程被用来做通用网络处理 。
IMMEDIATE
这是被几个设备驱动用来将任务排队成稍后执行的通用过程 。
当设备驱动或者核心中其他部分需要调度某些工作延迟完成时,它们将把这些任务加入到相应的系统队列中去,如定时器队列,然后对核心发出信号通知它需要调用某个底层处理过程 。具体方式是设置bh_active中的某些位 。如果设备驱动将某个任务加入到了immediate队列并希望底层处理过程运行和处理它,可将第8位置1 。每次系统调用结束返回调用进程前都要检查bh_active 。如果有位被置1则调用处于活动状态的底层处理过程 。检查的顺序是从0位开始直到第31位 。

每次调用底层处理过程时bh_active中的对应位将被清除 。bh_active是一个瞬态变量,它仅仅在调用调度管理器时有意义;同时它还可以在空闲状态时避免对底层处理过程的调用 。


11.2任务队列



图 11.2: 一个任务队列


任务队列是核心延迟任务启动的主要手段 。Linux 提供了对队列上任务排队以及处理它们的通用机制 。

任务队列通常和底层处理过程一起使用;底层的定时器队列处理过程运行时对定时器队列进行处理 。任务队列的结构很简单,如图11.2 所示,它由一个tq_struct结构链表构成,每个节点中包含处理过程的地址指针以及指向数据的指针 。

处理任务队列上元素时将用到这些过程,同时此过程还将用到指向这些数据的指针 。

核心的所有部分,如设备驱动, 都可以创建与使用任务队列 。但是核心自己创建与管理的任务队列只有以下三个:

timer
此队列用来对下一个时钟滴答时要求尽快运行的任务进行排队 。每个时钟滴答时都要检查此队列看是否为空,如果不为空则定时器底层处理过程将激活此任务 。当调度管理器下次运行时定时器队列底层处理过程将和其他底层处理过程一道对任务队列进行处理 。这个队列不能和系统定时器相混淆 。

推荐阅读