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

2016-01-29 19:41 14 1 收藏

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

【 tulaoshi.com - 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 
此队列用来对下一个时钟滴答时要求尽快运行的任务进行排队。每个时钟滴答时都要检查此队列看是否为空,如果不为空则定时器底层处理过程将激活此任务。当调度管理器下次运行时定时器队列底层处理过程将和其他底层处理过程一道对任务队列进行处理。这个队列不能和系统定时器相混淆。 
immediate 
immediate 底层处理过程的优先级低于定时器底层处理过程,所以此类型任务将延迟运行。 
scheduler 
此任务队列直接由调度管理器来处理。它被用来支撑系统中其他任务队列,此时可以运行的任务是一个处理任务队列的过程,如设备驱动。 
当处理任务队列时,处于队列头部的元素将从队列中删除同时以空指针代替它。这个删除操作是一个不可中断的原子操作。队列中每个元素的处理过程将被依次调用。这个队列中的元素通常使用静态分配数据。 然而并没有一个固有机制来丢弃已分配内存。任务队列处理例程简单的指向链表中下一个元素。这个任务才真正清除任何已分配的核心内存。 


11.3  定时器(TIMER)



图11.3 系统定时器 


操作系统应该能够在将来某个时刻准时调度某个任务。所以需要一种能保证任务较准时调度运行的机制。希望支持每种操作系统的微处理器必须包含一个可周期性中断它的可编程间隔定时器。这个周期性中断被称为系统时钟滴答,它象节拍器一样来组织系统任务。 

Linux的时钟观念很简单:它表示系统启动后的以时钟滴答记数的时间。所有的系统时钟都基于这种量度,在 系统中的名称和一个全局变量相同-jiffies。 

Linux包含

来源:https://www.tulaoshi.com/n/20160129/1509921.html

延伸阅读
信号量作为一种同步机制,在每个成熟的现代操作系统的实现过程中,起着不可替代的作用,对于Linux也不例外,在Linux2_4_x下,实现内核信号量机制的代码虽然不长,但由于涉及到多个进程间的相互干扰,并且在Linux发展过程中,不断进行优化,所以非常难于理解,在讲解Linux源代码的各类文章中,也大都对此语焉不详,本人通过认真阅读,对这部分代...
  第十五章 Linux核心数据结构 本章列出了Linux实用的主要数据结构。 block_dev_struct 此结构用于向核心登记块设备,它还被buffer cache实用。所有此类结构都位于blk_dev数组中。 struct blk_dev_struct { void (*request_fn)(void); struct request * current_request; struct reque...
  针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法, 而不是解说linux复杂的内核机制; 一.核心源程序的文件组织: 1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的 核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(...
    所有的Unix内核都同宗同源,并且提供相同的API,现代的Unix内核存在许多设计上的相似之处。Unix内核几乎毫无例外的都是一个不可分割的静态可执行块(文件)。也就是说,它们必须以完整、单独的可执行块的形式在一个单独的地址空间中运行。Unix内核几乎都需要硬件系统提供页机制以管理内存。这种页机制可以加强内存空间的保...
  第十章 网络 网络和Linux是密切相关的。从某种意义来说Linux是一个针对Internet和WWW的产品。它的开发者和用户用Web来交换信息思想、程序代码,而Linux自身常常被用来支持各种组织机构的网络需求。这一章讲的是Linux如何支持如TCP/IP等网络协议的。 TCP/IP协议最初是为支持ARPANET(一个美国政府资助的研究性...

经验教程

688

收藏

40
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部