注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早,分析的版本为2.4.16,故出现的一些概念可能跟最新版本内核不同。
此书已经开源,阅读地址 http://www.kerneltravel.net
1、中断向量
Intel x86 系列微机共支持256 种向量中断,为使处理器较容易地识别每种中断源,将
它们从0~255 编号,即赋予一个中断类型码
n
,Intel 把这个8 位的无符号整数叫做一个向
量,因此,也叫中断向量。所有256 种中断可分为两大类:
异常和中断
。
异常又分为故障(Fault)、
陷阱(Trap)和夭折(Abort)
,它们的共同特点是既不使用中断控制器,又不能被屏蔽。中断又分为外部可
屏蔽中断(INTR)和外部非屏蔽中断(NMI),所有I/O 设备产生的中断请求(IRQ)均引起屏
蔽中断,而紧急的事件(如硬件故障)引起的故障产生非屏蔽中断。
非屏蔽中断的向量和异常的向量是固定的,而屏蔽中断的向量可以通过对中断控制器的
编程来改变。Linux 对256 个向量的分配如下。
• 从0~31 的向量对应于异常和非屏蔽中断。
• 从32~47 的向量(即由I/O 设备引起的中断)分配给屏蔽中断。
• 剩余的从48~255 的向量用来标识
软中断
。Linux 只用了其中的一个(即128 或0x80
向量)用来实现
系统调用
。当用户态下的进程执行一条
int 0x80
汇编指令时,CPU 就切换到
内核态,并开始执行system_call() 内核函数。
2、外设可屏蔽中断、异常及非屏蔽中断
Intel x86 通过两片中断控制器8259A 来响应15 个外中断源,每个8259A 可管理8 个中