- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                IA32上Linux内核中断机制分析
                    IA32上Linux内核中断机制分析
[原创]IA32上Linux内核中断机制分析
文章标题:[原创]IA32上Linux内核中断机制分析顶部 albcamus 发布于:2005-11-2120:57   [楼主][原创]IA32上Linux内核中断机制分析
文章作者:albcamus(albcamus@)
信息来源:邪恶八进制信息安全团队()
本文章首发whitecell()后由原作者友情提交到邪恶八进制信息安全团队技术论坛转载请注明文章作者
中断是计算机与外界联系的唯一途径。本文将分析在IA-32体系结构上的Linux内核对待中断系统的处理,针对的是2.6内核,引用的代码则具体则是2.6.14的。
一。几个相关概念的澄清
1,中断信号:
在电路级别来说,中断就是输送到CPU的INTR引脚上的电平信号。
2,可编程中断控制器(PIC,ProgrammableInterruptController):
PIC是在计算机外部设备与CPU之间的芯片,它负责把自己接收到的外部中断信号,提交给CPU。在80386中,PIC是两片i8259A芯片级联;在Pentium以及后来的CPU中,集成了一个叫做高级可编程中断控制器(AdvancedProgrammableInterruptController)的PIC。如果你想用IA32处理器搭建SMP系统,则APIC是必不可少的。
3,中断向量与中断号:
中断向量是Intel从IA-32CPU角度看到的中断信号划分;中断号则是Linux系统对外部中断的号码分配。当外设把中断信号递送给PIC时,与之关联的是一个“中断号”(每个中断号对应一条中断线,从软件的角度来看,这两个术语可以混用);当PIC把这个中断信号发送给CPU时,与之关联的是一个“中断向量”。
在IA-32体系结构中,所有的异常和不可屏蔽中断(Non-MaskableInterrupt)的中断向量都是Intel预先定义的,软件无法更改;可屏蔽中断的中断向量可以通过编程来更改。在Linux上,0号中断(也就是时钟中断)对应的中断向量是0x20,也就是十进制的32。
4,异常(Exception)
顾名思义,异常是指CPU检测到了某种不正常的情形出现。CPU产生的异常是不可屏蔽的(eflags寄存器的IF位对异常不起作用),根据异常处理程序返回时,是否需要重新执行引发异常的那条指令,又可以把异常分为3种:
1)故障(Fault)。故障是比较轻微的异常,返回时重新执行引发故障的那条指令。
2)陷阱(Trap)。陷阱处理返回时,不重新执行引发陷阱的那条指令。
3)中止(Abort)。中止是严重的异常,将导致任务的中止而不会返回。
还有一种是程序产生的异常,如INT3指令、BOUND指令等。CPU把这种异常当作是陷阱来处理。
5,中断描述表IDT
异常与中断发生时,都需要到IDT中查找相关信息,以找到对应的处理程序以及其他动作。需要注意的是,保护模式下发生权限提升时,中断穿越的是中断门,而异常穿越的是陷阱门。二者的区别是:当CPU穿越中断门时,是自动关中断的;而穿越异常门则不会。
二。重要数据结构与函数
在系统引导期间,需要初试化中断处理(asm/i386/kernel/entry.S):
422#defineBUILD_INTERRUPT(name,nr)\
423ENTRY(name)\
424pushl$nr-256;\#这里得到一个负数,因为正数留给系统调用
425SAVE_ALL\#保存寄存器
426movl%esp,%eax;\
427callsmp_/**/name;\
428jmpret_from_intr;
其中,SAVE_ALL宏就是用来保存寄存器的。
内核书籍中经常提到的中断上下文,指的是内核正在运行中断服务程序或softirq,无法代表当前进程的情形。中断上下文没有自己专有的堆栈,相反,它借用被中断进程的内核堆栈──IA-32上的Linux默认这个堆栈只有8k大小,而且很可能在处理中断的过程中又被另一个中断源中断。因此如果你自己编写中断处理程序,递归层次太深或者函数局部变量太大,都有可能导致栈溢出。(i386有一个4KStacks补丁,如果编译时打开该选项,则中断上下文使用独立的栈,而不占用被中断进程的。)
在include/linux/irq.h文件中,定义了一个中断描述数组iqr_desc[NR_IRQS],每一个中断向量都与它的一个元素相关联:
70typedefstructirq_desc{
71hw_irq_controller*handler;
72void*handler_data;
73structirqaction*action;/*IRQactionlist*/
74unsignedintstatus
                
原创力文档
                        

文档评论(0)