您的位置:首页 > 运维架构 > Linux

读深入理解Linux内核 (第4章 中断和例外)

2016-09-23 16:59 489 查看
中断,通常指异步中断,主要来自外设,也包括内部某些中断,如时钟中断。异步中断发生的时间是任意的,和CPU执行过程没有直接关系。

例外,也称为同步中断,CPU执行指令直接导致,比如缺页,除零等。

例外又分为两大类,
第一类:处理器检测到的例外,包括以下几个子类,
1.
缺陷(faults),比如缺页,通常例外处理程序处理后,恢复到原来的地址执行
2.陷阱(traps),traps主要指指令主动产生的例外,比如调试指令,断点
3.中止(aborts),发生了不可恢复的错误,如除零。Abort发生后,会中断当前程序,并且会发送信号给应用程序

第二类:可编程的例外。比如int指令,又称为软中断,用于系统调用陷入内核空间

IRQs和中断

IRQ 值Interrupt ReQuest Line,中断请求线,设备通过它发送中断信号给中断控制器(PIC–
Programmable Interrupt Controller)。

中断控制器 ---- 捕获外部设备的中断请求,处理优先级,然后发送信号给CPU的中断脚。中断控制器提供中断状态寄存器,中断屏蔽寄存器,中断待定寄存器给CPU访问。

IRQ0 指第一根中断控制线。

例外

常见的有,除零,断点(通常由调试器插入),缺页,无效内存等,每个例外都有自己的例外处理程序。

软件IRQ(SoftIrqs)和Tasklet(小任务)

软件IRQ和Tasklet是用来处理从中断中分离出来,不需要立即处理的任务或数据,减少ISR的负荷,也称为中断的下半部。

SoftIRQ基本限定在某些用途中,包括Tasklet实际是由其中一个SoftIRQ来执行。

SoftIRQ是运行在中断上下文,所以tasklet也是运行在中断上下文中。

tasklet创建后,放在队列中被顺序执行,tasklet中不应该有休眠或调度的行为。

tasklet的使用方法,

1. tasklet_init(),参数包括tasklet函数方法

2. tasklet_enable()

3. 然后在中断服务程序中,可以调用tasklet_schedule()来让tasklet取得运行机会

工作队列

使用工作队列来让内核函数延迟到在后面某个时刻执行。工作队列是由工作者线程(WorkerThread),这个内核线程调用,所以是进程上下文,可以调度出去,这也是它和tasklet比较关键的差别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux kernel 线程