第七节异常控制流.ppt

  1. 1、本文档共83页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux中对异常的处理 Linux中对异常的处理 Linux中对异常的处理 Linux中对中断的处理 对于大部分异常,Linux只是给引起异常的当前进程发送一个信号就结束异常处理,具体的异常处理转到信号处理程序进行。 对于中断,因为中断事件的发生与正在执行的当前进程很可能没有关系,所以将一个信号发给当前进程没有意义。 Linux中有三种类型中断。① I/O中断:I/O外设的中断请求;② 时钟中断:某时钟产生的中断请求,告知固定时间间隔到;③ 处理器中断:多处理器系统中其他处理器发出的中断请求。后两种超出了本教材范围 I/O中断:每个能发中断请求的外设控制器都有一条IRQ线,所有IRQ线连接到一个可编程中断控制器PIC (Programmable Interrupt Controller)中对应的IRQ引脚上,PIC中每个IRQ引脚都有一个编号,如IRQ0、IRQ1、…、IRQi、…,将与 IRQi 关联的中断类型号设定为32+i。 哪些来自CPU? 哪些送CPU? 哪些来自设备? 可编程中断控制器PIC INTR IA-32的中断类型 用户自定义类型号为32~255,部分用于可屏蔽中断,部分用于软中断 可屏蔽中断通过CPU的INTR 引脚向CPU发出中断请求 中断类型号为32+i (i为中断请求号IRQi) 软中断指令 INT n 被设定为一种陷阱异常,例如,Linux通过int $0x80指令将128号设定为系统调用,而Windows通过int $0x2e指令将46号设定为系统调用。 Linux中对中断的处理 PIC需对所有外设来的 IRQ请求按优先级排队,若至少有一个IRQ线有请求且未被屏蔽,则 PIC向 CPU的 INTR引脚发中断请求。 CPU每执行完一条指令都会查询 INTR,若发现有中断请求,则进入中断响应过程(关中断、保护断点和现场、发中断查询信号),调出中断服务程序执行。 所有中断服务程序的结构类似,都划分为以下三个阶段。 ① 准备阶段:在内核栈中保存各通用寄存器的内容(称为现场信息)以及所请求 IRQi 的值等,并给PIC回送应答信息,允许其发送新的中断请求信号。 ② 处理阶段:执行 IRQi 对应的中断服务例程 ISR (Interrupt Server Routine)。中断类型号为32+i ③ 恢复阶段:恢复保存在内核栈中的各个寄存器的内容,切换到用户态并返回到当前进程的逻辑控制流的断点处继续执行。 IA-32/Linux的系统调用 系统调用(陷阱)是特殊异常事件,是OS为用户程序提供服务的手段。 Linux提供了几百种系统调用,主要分为以下几类: 进程控制、文件操作、文件系统操作、系统控制、内存管理、网络管理、用户管理、进程通信等 系统调用号是系统调用跳转表索引值,跳转表给出系统调用服务例程首址 Trap举例: Opening File 用户程序中调用函数 open(filename, options) open函数执行陷阱指令(即系统调用指令“int”) 0804d070 __libc_open: . . . 804d082: cd 80 int $0x80 804d084: 5b pop %ebx . . . User Process OS 陷入OS 文件打开操作 返回到pop指令执行 int $0x80 pop %ebx Open系统调用(system call):OS must find or create file, get it ready for reading or writing,Returns integer file descriptor 通过执行“int $0x80”指令,调出OS完成一个具体的“服务”(称为系统调用) 这种“地雷”一定“爆炸” IA-32/Linux的系统调用 通常,系统调用被封装成用户程序能直接调用的函数,如exit()、read()和open(),这些是标准C库中系统调用对应的封装函数 。 Linux中系统调用所用参数通过寄存器传递,传递参数的寄存器顺序依次为:EAX(调用号)、EBX、ECX、EDX、ESI、EDI和EBP,除调用号以外,最多6个参数。 封装函数对应的机器级代码有一个统一的结构: 总是若干条传送指令后跟一条陷阱指令。传送指令用来传递系统调用的参数,陷阱指令(如int $0x80)用来陷入内核进行处理。 例如,若用户程序调用系统调用write(1, “hello, world!\n”,14),将字符串“hello, world!\n”中14个字符显示在标准输出设备文件stdout上,则其封装函数对应机器级代码(用汇编指令表示

文档评论(0)

189****6140 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档