linux异常处理..docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux异常处理.

?linux下糟糕的异常处理方式   linux下发生异常,芯片会自动产生一个异常中断。在这异常中断处理程序中会判断异常来自用户程序或者内核,如果是发生在用户程序,那么会产生一个异常信号,再根据异常信号的回调函数通知用户程序发生异常。如果发生在内核里面,那么就会搜索内核模块的异常结构表,找到相应的处理调用地址,修改异常中断的返回地址为异常处理的地址,中断返回的时候程序就跳到异常处理程序处理执行了。但具体这两种处理方法都很糟糕,下面简要分析一下。      linux系统把所有进程数据结构都放于内核,这就增加了一些不必要的切换时间。 linux可以通过系统调用,安装信号的回调函数,这回调函数指针存放在内核的进程数据结构里面。这点windows处理得比较好,windows把进程数据结构分成了两部分,一部分敏感数据放于内核的进程数据结构里面,加以保护,另一部分不敏感数据就放于用户空间,这样当访问那些不加保护的数据时,就不用切换到内核,节约了时间。像windows下异常处理,也是一种回调函数,但因为结构放于用户空间,安装的时候就很方便,也节约切换时间。   上面那一点只是效率问题,但linux内核的异常处理那才是糟糕。先介绍一下linux内核的异常处理结构吧,看明白了你自然就知道糟糕到什么程度了。要了解这,显然应该是先从异常中断入手。下面主要是x86芯片的一些处理,但别的芯片下的也应该差不多。 文件:entry.S: ENTRY(general_protection) pushl $ SYMBOL_NAME(do_general_protection) jmp error_code 这是异常中断入口,显然会执行do_general_protection。 文件traps.c:   asmlinkage void do_general_protection(struct pt_regs * regs, long error_code) { if (regs-eflags VM_MASK)  goto gp_in_vm86; /*  ?虚拟8086下发生的异常否 */ if (!(regs-xcs 3))  goto gp_in_kernel; /*  内核发生的异常否 */ current-tss.error_code = error_code; current-tss.trap_no = 13; force_sig(SIGSEGV, current); /*  用户程序发生的异常,产生异常信号,  根据异常信号的句柄回调处理函数 */ return; gp_in_vm86: lock_kernel(); handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code); /*  虚拟8086的处理 */ unlock_kernel(); return; gp_in_kernel: {  unsigned long fixup;  fixup = search_exception_table(regs-eip); /*  根据异常时的eip搜索异常结构链  找到处理程序地址 */  if (fixup) {  ?regs-eip = fixup; /*  ?找到异常处理地址,修改中断返回地址,中断返回时跳到异常处理程序处 */  ?return;  }  die(general protection fault, regs, error_code); /*  没找到异常处理程序地址,显示内核异常信息后死机 */ } } 搜索异常处理程序代码文件extable.c: extern const struct exception_table_entry __start___ex_table[]; extern const struct exception_table_entry __stop___ex_table[]; unsigned long search_exception_table(unsigned long addr) { unsigned long ret; #ifndef CONFIG_MODULES /* There is only the kernel to search. */ ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr); if (ret) return ret; #else /* The kernel is the last module -- no need to treat it special. */ struct modul

文档评论(0)

bhzs + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档