- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux操作系统内核分析 湘潭大学信息工程学院 讲课内容 中断管理 进程管理 信号处理 中断的概念 改变处理器正常执行顺序的事件 中断来源: 硬件:时钟、键盘、硬盘等,异步发生 异常:CPU检测到的错误 软件 系统调用:进程向OS发出的请求 中断向量 保护模式支持256个中断,每个中断用一个0到255的整数来标识,把这个整数称为中断向量 0到31对应异常(P76表5-2) 32到47对应硬件中断(P9图2-5) 48到255预留,linux使用了0x80作为系统调用 中断 保护模式下中断处理 Head中对中断描述符表的处理 在程序232行(P58),定义了有256个中断描述符的中断描述符表,并在程序开始处把该描述符表的基地址输出(可以被C程序使用) 在程序78行(P54),把这256个中断描述符中的处理程序设置为ignore_int 在程序105行(P55)把中断描述符表的基地址装入到idtr寄存器中 gcc嵌入汇编 _asm_ _volatile_( 汇编语句 : 输出寄存器 : 输入寄存器 : 会被修改的寄存器); 输出寄存器:“=代表寄存器的字母” (变量名) 寄存器的值会被写入变量中 输入寄存器:“代表寄存器的字母” (变量名) 用变量的值初始化寄存器 常用寄存器加载代码 嵌入汇编示例 #define __save_flags(x) \ _ asm_ _volatile_( \ “pushfl;” \ “popl %0” \ : “=a” (x) \ ); 嵌入汇编示例 #define get_seg_byte(seg,addr)({ register char _res; _ _asm_ _(“ push %%fs; mov %%ax, %%fs; movb %%fs:%2,%%al; pop %%fs” :“=a”(_res) :“0”(seg), “m”(*(addr))); _res; }) _set_gate宏 _set_gate宏(定义在system.h,P390的22行),用来设置中断描述符 gate_addr:描述符的地址 type:描述符的类型 dpl: 使用描述符的最低权限 addr:中断处理函数的地址 _set_gate宏 #define _set_gate(gate_addr,type,dpl,addr) \ __asm__ (movw %%dx,%%ax\n\t \ movw %0,%%dx\n\t \ movl %%eax,%1\n\t \ movl %%edx,%2 \ : \ : i ((short) (0x8000+(dpl13)+(type8))), \ o (*((char *) (gate_addr))), \ o (*(4+(char *) (gate_addr))), \ d ((char *) (addr)),a (0) _set_gate宏 设置中断描述符 #define set_trap_gate(n,addr) \ _set_gate(idt[n],15,0,addr) #define set_system_gate(n,addr) \ _set_gate(idt[n],15,3,addr) 异常初始化 trap.c中的trap_init()(P80的181行)函数负责再次初始化中断描述符表,该函数在main函数(P65的127行)中被调用 异常的中断向量参见P76表5-2 中断初始化 在traps.c中的trap_init函数的最后( P81第207行)设置了并口(0x27)的中断描述符 在sche.c中的sched_init函数的最后(P103第409行)设置了时钟中断(0x20)的中断描述符 参见P9图2-5 系统调用初始化 在sche.c中的sched_init函数的最后(P103第411行)设置了系统调用(0x80)的中断描述符 中断处理 中断处理完后,进程会按照被打断前的状态继续运行,所以需要保存该状态。 中断处理 中断处理程序总是在内核中,所以从发生中断时执行的代码到中断处理程序可能会伴随着特权级别的变化。 中断处理 中断处理 当发生中断时,如果当前进程运行在内核态,CPU会将EFLAGS、CS、和EIP寄存器中的内容压入堆栈 当发生中断时,
文档评论(0)