Linux 2.4 内核说明文档(进程与中断管理篇)(5)

2020-05-21 00:00:00 函数 执行 内核 时钟 中断

2.6. 内核时钟

现在我们来看看内核时钟。内核时钟常用来为细节函数(时钟处理函数)分派执行时间。主数据结构timer_list定义在include/linux/timer.h文件中:

struct timer_list {
struct list_head list;
unsigned long expires;
unsigned long data;
void (*function)(unsigned long);
volatile int running;
};

list字段用于链接内部链表,操作时由timerlist_lock同步锁保护。expires字段表示了处理函数在以data数据为参数被调用的时间数值。running字段用于SMP机上标识时钟处理函数当前是否运行在其他CPU上。
函数add_timer()和del_timer()用于从链表中增加和删除一个时钟。当时钟终止时,它自动被移出。在时钟被使用之前,它必须被init_timer函数初始化;在其被添加到链表之前,function字段和expires字段必须被设置。


2.7. 下半部机制

bottom half(又名下半部机制)是Linux提高系统中断响应和处理能力的有效机制。 发生中断时,处理器要停止当前正在执行的指令,而操作系统负责将中断发送到对应的设备驱动程序去处理。在中断的处理过程中,系统不能进行其他任何工作,因此,在这段时间内,设备驱动程序要以快的速度完成中断处理,而其他大部分工作在中断处理过程之外进行。Linux 内核利用bottom half处理过程帮助实现中断的快速处理。在中断有效的情况下,有时需要将一个任务分割成小份,以便中断可以获取到资源及时处理,而任务则稍后再继续(例如,对数据进行后加工,唤醒等待该数据的进程等)。
Bottom halves是用于延缓内核任务执行的旧有机制,在linux 1.x中已经实现了。在2.0内核,提供了一个新机制,称为“任务队列”。
Bottom halves由global_bh_lock旋转锁控制,即是在任何CPU上每刻仅有一个bottom half工作。无论如何,当尝试执行处理程序时,如果global_bh_lock,则bottom half被标识为执行态,进程也就得以继续。
Linux中总共仅能注册32个bottom half,操作bottom half的函数如下:
 void init_bh(int nr, void (*routine)(void)):为运行状态宏注册bottom half处理函数。这些状态宏以XXXX_BH格式定义在include/linux/interrupt.h 文件中,例如TIMER_BH或者TQUEUE_BH。通常子系统初始化运行环境时就会调用此函数注册bottom half。
 void remove_bh(int nr):执行init_bh()相反的操作,删除指定宏。这里没有错误校验过程,因此可能会影响系统。通常子系统清除运行环境时就会调用这个函数。
 void mark_bh(int nr):将bottom half 标识为执行态。通常,一个中断处理函数就会这样做。
Bottom halves是一些全局的排斥锁,所以问题“什么时候bottom half处理函数会执行”就相当于“什么时候排斥锁会执行”。这个答案就是:a)在每一个schedule里面,b)在每一个中断或者系统调用返回时。

文章来源CU社区:Linux 2.4 内核说明文档(进程与中断管理篇)

相关文章