- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章 Linux的中断和中断处理
2.1 X86 CPU对中断的硬件的支持
2.1.1中断的有关数据结构
一、中断向量
Intel在i386后实现保护模式时,将中断向量表(也称为中断描述符表 IDT)中的表项,从单纯的入口地址改成了类似PSW的描述项,称为门(gate)。
而且中断向量表可以放在内存中的任何地方(不再限于从0开始)。
只要想切换CPU的运行状态,就要通过一道门。按不同的用途和目的,CPU中一共有4种门:
中断门(interrupt gate)
陷阱门(trap gate 即异常)
任务门(tast gate)
调用门(call gate)
Linux内核,不使用任务门,基本上也不使用调用门
(不过为了兼容,也支持通过调用门来进入系统调用)
二、中断门、陷阱门的结构
每个门的大小为64位,调用门、中断门、及陷阱门为同一个结构:
段内位移
高位 P DPL 0 D 类型码 000 TSS段
选择码 段内位移
低位 P:P标志位,为1表示在内存
DPL:描述项优先级(内核为0级,用户态为3级)
当通过INT指令进入中断时,CPU的运行优先级(CPL)
必须低于和等于该中断的DPL,才能穿过此陷阱门;
而外中断、CPU异常则不进行此项检验
D:D标志位,为1表示32位、0表示16位
类型码:调用门(100)、中断门(110)、陷阱门(111)
TSS段选择码:
类似于段寄存器,指向一个任务状态段(TSS,相当于PSW,用来保存任务运行的现场)
在保护模式下,该选择码指向全局、或局部段(由其中的IT标志位定)描述表的一个表项。
(在Linux中,指向全局段描述表GDT的一个表项)。
说明:中断门和陷阱门的主要区别在于:
通过中断门进入中断服务程序时,CPU会自动关闭中断,以防止嵌套中断的发生;
而在通过陷阱门进入中断服务程序时则不会。
2.2 中断的初始化结构
一、中断向量表IDT的初始化
在初始化阶段,Linux内核完成了对页式虚存管理的初始化后,便调用2个函数进行中断机制的初始化。
1、为系统保留的中断向量(内中断)
由函数trap_init( )对系统保留的32个中断向量(中断向量号为0x00~0x1f,即0~31)进行初始化。包括:
(1)为CPU保留,用于异常处理的20个陷阱门(0~19),如页面异常的陷阱门(0x0e 14);
(2)用于系统调用的一个中断向量(陷阱门0x80);
(3)2个调用门(call gate):为了实现应用程序的兼容(Linux本身并不使用调用门,但有些Unix的变种使用调用门来实现系统调用)。
2、用于外设的中断向量(外中断)
由函数init_IRQ( )对IDT中其他224个用于外设的中断向量进行初始化。
在单处理器环境下,只使用了IDT中的16项,其余的为空(除0x80外,其余的用于多处理器环境)
3、初始化后的IDT结构
初始化后的IDT结构的示意图,如下所示:
? ? ? ? ? ? NULL ...... ? ? ...... ? NULL
二、外中断请求队列
在单处理器环境下Linux中,由于只使用16个外中断向量,因此有些外部中断源必须共享同一个中断向量。
1、共享中断向量的实现方式
(1)每个外中断向量,指向的都是该中断的一个总服务程序(IRQ0x00_interrup ~IRQ0x0f_interrup),完成该中断服务的初时化工作(程序不同,但功能类似);
(2)为每个外中断向量设置一个中断请求队列,使用同一个中断向量所有中断源,其具体的中断服务程序,挂在同一个中断请求队列中;
(3)每个中断请求队列的头部及控制结构,定义在一个结构数组irq_desc[ ]中(与IDT外中断表项一一对应)
2、外中断请求队列的结构
handler actino handler actino
2.3 中断的响应和处理
假定系统正在用户空间运行(CPU当前运行级别CPL为3),某个外设产生了一个外中断请求(如中断号为0x03)
该请求通过中断控制器i8259A到达了CPU的“中断请求”引线INTR。
2.3.1中断响应
CPU执行完当前指令后,进行中断的检测。
(1)从中断控制器取得中断号(0x03);
(2)由中断号从IDT中(首址为FIRST_EXTERNAL_ VECTOR),找到相应的中断向量表项(中断门),得到:
该中断的优先级DPL为0
及总服务程序(IRQ0x03_interrup)的入口地址
(3)由于CPL=3、DPL=0,可以进行运行空间的切换:
从寄存器TR(当前运行指针)所指的当前TSS中
(相当于PSW现场,其中有3个堆栈的指针)
取出内核的堆栈指
您可能关注的文档
最近下载
- 2025年天津市中考英语真题卷(含答案与解析).pdf VIP
- 工商银行swift代码大全.pdf VIP
- 文献检索与科技论文写作 课件全套 第1--9章 绪论、科技文献检索基础知识---科技论文的投稿.pdf VIP
- 《企业安全生产主要负责人和管理人员培训课件》.ppt VIP
- 宠物临床诊疗职业技能评价规范 宠物医师助理.pdf VIP
- 等离子体电极用碳化铪粉末、其制造方法、碳化铪烧结体和等离子体电极.pdf VIP
- 湖南师大附中2022-2023学年高一下学期期末数学试题含答案.pdf VIP
- 温室气体(GHG)管理手册.doc VIP
- SBS改性沥青防水卷材施工方案.docx VIP
- 多相流体的数值模拟及计算方法.pdf VIP
文档评论(0)