文档介绍:Linux 分析报告
——系统定时器队列机制及相关的定时器操作
计算机系 98 级研究生班
9811551
周启龙
目录
第一章硬件基础
时钟
中断处理
可编程中断控制器
中断处理
实时时钟(RTC)中断
第二章核心机制
bottom half 处理机制
系统定时器
定时器(TIMER)的原理
定时器的系统调用机制
第三章系统定时器队列机制
Linux 系统管理 timer_list 结构定时器的数据模型
主要数据结构的定义()
tvecs:系统定时器队列的数据模型
run_timer_list()分析(kernel/)
internel_add_timer(struct timer_list *timer)分析
系统定时器队列的级联处理及 run_timer_list()流程
小结
第四章实时时间定时器的操作
实时时间定时器的添加操作
进程实时时间定时器的状态的获得
第五章总结
第一章硬件基础
时钟
所有的操作系统都必须准确的得到当前时间,所以现代 PC 包含一个特殊的
外设称为实时时钟(RTC)。它提供了两种服务:可靠的日期和时间以及精确的时
间间隔。RTC 有其自身的电池这样即使 PC 掉电时它照样可以工作,这就是 PC
总是"知道"正确时间和日期的原因。而时间间隔定时器使得操作系统能进行准确
的调度工作。
中断处理
本节主要描叙 Linux 核心的中断处理过程。尽管核心提供通用机制与接口来
进行中断处理,大多数中断处理细节都是 CPU 体系结构相关的。
实时时钟(RTC)
图 级连的 8259A 控制器
可编程中断控制器
一般的 IBM PC 兼容机使用 Intel 82C59A-2 CMOS 可编程中断控制器或其派
生者。图 给出了两个级连的 8 位控制器 PIC1 和 PIC2,每个控制器都有一个
屏蔽与中断状态寄存器。这两个屏蔽寄存器分别位于 ISA I/O 空间 0x21 和 0xA1
处,状态寄存器则位于 0x20 和 0xA0。对此屏蔽寄存器某个特定位置位将使能某
一中断,写入 0 则屏蔽它。
当有中断产生时,中断处理代码将读取这两个中断状态寄存器(ISR)。它将
0x20 中的 ISR 看成一个 16 位中断寄存器的低 8 位而将 0xA0 中的 ISR 看成其高 8
位。这样 0xA0 中 ISR 第 1 位上的中断将被视作系统中断 9。PIC1 上的第二位由
于被用来级连 PIC2 所以不能作其它用处,PIC2 上的任何中断将导致 PIC1 的第
二位被置位。
中断处理
设备中断
处理过程
图 Linux 中断处理数据结构
Linux 核心需要将来自硬件设备的中断传递到相应的设备驱动。这个过程由
设备驱动向核心注册其使用的中断来协助完成。在/proc/interrupts 文件中你
可以看到设备驱动所对应的中断号及类型。
Linux 使用一组指针来指向包含处理系统中断的例程的调用地址。这些例程
属于对应于此设备的设备驱动。设备驱动负责在设备初始化时申请其需要的中
断。图 给出了一个指向一组 irqaction 的 irq_action 指针。每个 irqaction 数据
结构中包含了对应于此中断处理的相关信息,包括中断处理例程的地址。而中断
个数以及它们被如何处理则会根据体系结构及系统的变化而变化。Linux 中的中
断处理代码就是和体系结构相关的。这也意味着 irq_action 数组的大小随于中断
源的个数而变化。
中断发生时 Linux 首先读取系统可编程中断控制器中中断状态寄存器判断出
中断源,将其转换成 irq_action 数组中偏移值。例如中断控制器引脚 6 来自软盘
控制器的中断将被转换成对应于中断处理过程数组中的第 7 个指针。如果此中断
没有对应的中断处理过程则 Linux 核心将记录这个错误,不然它将调用对应此中
断源的所有 irqaction 数据结构中的中断处理例程。
当 Linux 核心调用设备驱动的中断处理过程时此过程必须找出中断产生的原
因以及相应的解决办法。为了找到设备驱动的中断原因,设备驱动必须读取发生