设为首页】 【加入收藏】 【网站地图】 【商品折扣
娱乐一生 娱乐明星
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
首页  |  Linux  |  Windows xp  |  windows2003  |  Windows Vista  |  资讯动态  |  UNIX  |  Windows9x  |  Windows2000  |  Mac Os  |  FreeBSD  |  Solaris  |  Vista系统
当前位置:首页 >> Linux >> Linux操作系统下糟糕的异常处理方式 [Linux教程]

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。文件tra .c:

asmlinkage void do_general_protection(struct pt_regs * regs, long error_code) 
{ 
if (regs->eflags &am  VM_MASK) 
goto gp_in_vm86; 

/* 
虚拟8086下发生的异常否 
*/ 

if (!(regs->xcs &am  3)) 
goto gp_in_kernel; 
/* 
内核发生的异常否 
*/ 

current->t .error_code = error_code; 
current->t .trap_no = 13; 
force_sig(SIGSEGV, current); 
/* 
用户程序发生的异常,产生异常信号, 
根据异常信号的句柄回调处理函数 
*/ 
retur  

gp_in_vm86: 
lock_kernel(); 
handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code); 
/* 
虚拟8086的处理 
*/ 
unlock_kernel(); 
retur  

gp_in_kernel: 
{ 
u igned long fixu  
fixup = search_exception_table(regs->eip); 
/* 
根据异常时的eip搜索异常结构链 
找到处理程序地址 
*/ 
if (fixup) { 
regs->eip = fixu  
/* 
找到异常处理地址,修改中断返回地址,中断返回时跳到异常处理程序处 
*/ 
retur  
} 
die("general protection fault", regs, error_code); 
/* 
没找到异常处理程序地址,显示内核异常信息后死机 
*/ 

} 
}

 [2] [3] 下一页



 

娱乐图摘

更多 >>

靓丽清纯美女meimei

美女私房全裸照
导演劝女演员脱衣服(视频)

大胆火辣人体艺术写真(图)

黑丝妹妹热辣诱惑-丝袜美女妹妹

PLMM 漂亮妹妹图集-妹妹图库

全球美女图库-美女集中营

52MM 我爱漂亮妹妹-制服妹妹诱惑

图王图库-世界美女明星图片资料库
美女写真集锦

激情两性-解密性生活
浴室MM湿身内衣诱惑
邻家小妹洗澡被偷拍(视频)

热点文章

更多

· 如何制作Linux系统的安装光盘?
· 在硬盘中安装Linux操作系统最简单方法
· liunx安装问答
· 用WinGrub 引导Linux 简述
· Linux操作系统安装VMware过程详细解析
· 安装完linux后应该做的事(1)
· sis650显卡驱动自定义安装终极指南(RH80)
· Mount命令:Linux外置存储介质挂载方法
· Linux内核编译全过程详解(kernel2.6.7)
· router os端口映射方法

热点文章

更多