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

来源:互联网 发布:linux防御软件 编辑:程序博客网 时间:2024/05/18 00:41

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


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


例外又分为两大类,

第一类:处理器检测到的例外,包括以下几个子类,

1. 缺陷(faults),比如缺页,通常例外处理程序处理后,恢复到原来的地址执行

2.陷阱(traps),traps主要指指令主动产生的例外,比如调试指令,断点

3.中止(aborts),发生了不可恢复的错误,如除零。Abort发生后,会中断当前程序,并且会发送信号给应用程序


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


IRQs和中断

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

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

IRQ0 指第一根中断控制线。



例外

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



软件IRQSoftIrqs)和Tasklet(小任务)

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

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

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

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

tasklet的使用方法,

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

2. tasklet_enable()

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



工作队列

使用工作队列来让内核函数延迟到在后面某个时刻执行。工作队列是由工作者线程(WorkerThread),这个内核线程调用,所以是进程上下文,可以调度出去,这也是它和tasklet比较关键的差别。






0 0
原创粉丝点击