一种指令级Linux内核瞬时故障注入方法研究(2)

时间:2015-10-22 09:24 来源:www.fabiaoba.com 作者:张影 杨麦顺 张兴军 点击:

  其中,structkprobe*p是pre_handler函数的第1个参数;addr是structkprobe结构体的其中一项,保存了目标指令的地址。structpt_regs*regs是该函数的第2个参数,这个结构体是内核栈的部分映像,如图2所示,当程序中断转移时,此结构保存了中断时的CPU环境,包括ss,sp,flags,cs,ip,orig_ax,gs,fs,es,ds,ax,bp,di,si,dx,cx和bx等17项内容,完整地描述了目标指令运行时CPU环境。对指令运行环境注入故障可通过对pt_regs结构体的数据进行改写实现。

  在故障注入模块中,目标指令故障注入通过对指令地址对应的内存代码段进行写操作实现,运行环境故障注入通过对pt_regs结构体对应的内核栈进行写操作实现。

  故障的注入通过对内存不同区域的写操作完成,故障的触发则通过异常返回机制完成,异常返回时程序通过调用IRET指令和出栈指令将内核栈中保存的寄存器值重新加载进CPU的各个寄存器中。根据ip寄存器给出的指令地址,CPU将目标指令从内存代码段读出并加载进指令寄存器中。此时的寄存器值和目标指令均是根据测试人员的需求被注入故障的数据。

  3.5内核与外部的通信

  为满足故障注入模块与测试人员的交互需求,比如向故障注入模块提供故障模式等输入数据,IFIMK采用/proc文件系统作为内核模块与用户程序的通信接口。在IFIMK方法中,故障模式由测试人员在用户空间给出,出于对内核数据的保护,内核空间与用户空间不能直接通信,故障模式无法传送到故障注入模块。/proc虚拟文件系统提供了一种特殊的通信机制,通过将故障模式读写函数重新映射到内存读写控制函数上,建立了一条故障注入模块与用户程序之间的数据通道,从而允许故障注入模块接收来自测试人员的故障注入命令。

  4实验及结果分析

  4.1实验关键步骤描述

  IFIMK程序执行流程如图3所示。

  具体步骤如下:

  (1)IFIMK方法通过查询内核符号表System.map获取目标函数的首地址,通过Linux反汇编命图2内核堆栈与structpt_regs的映射令objdump查询目标指令相对于函数首地址的移量,偏移量和首地址之和即为所求目标指令的地址。

  (2)给定目标指令的地址、故障位置及故障类型生成故障模式,通过/proc虚拟文件系统传入故障注入内核模块。

  (3)根据传入的故障模式,将探测点加入到目标指令所在的地址,当程序再次执行到目标指令时,故障注入操作将被触发。下面是Kprobe探测点注册的核心代码,根据用户空间传来的故障模式fau_model初始化_个structkprobe类型变量kp,通过register_kprobe函数实现探测点注册。

  staticintinit_kprobe(void)

  {char*name=fau_model.symbolname;kprobe_opcode_t*modaddr=fau_model.offset+(kprobe_opcode_t*)fau_model.symboladdr;

  kp.addr=(kprobe_opcode_t*)(fau_model.symboladdr);

  kp.offset=fau_model.offset;kp.pre_handler=handler_pre;kp.post_handler=handler_post;register_kprobe(&kp);return0;}

  在pt_regs结构体中,ip项为即将执行的指令地址,Kprobe会在接下来的单步执行的准备工作中重新给ip项赋值,使它指向目标指令。同样Kprobe通过重新向flags赋值,为目标指令开启单步运行模式,使目标指令运行完后重新回到故障注入模块。当程序从int3返回,内核找内容向寄存器恢复时,orig_ax项会被跳过,不会返回到寄存器中。所以IFIMK将不对ip,flags和orig_ax三项内容注入故障。

  (4)再次执行到目标指令地址时,int3断点触发,故障注入操作被执行,目标指令故障注入通过对指令的写操作实现,运行环境故障注入通过对pt_regs结构体的写操作实现。

  (5)接下来执行目标指令,故障被触发。

  4.2实验过程

  本文实验以UbuntulO.04发行版,Linux2.6.32内核版本为目标系统,进行故障注入实验。一方面验证IFIMK方法的可行性,一方面根据实验结果分析故障类型对系统的失效率的影响。

  实验共设计了6种故障类型,如表1所示。分别有末位置〇、末位置1、末位翻转、全置〇、全置1、置随机数等,来模拟单粒子翻转(SEU)、多比特翻转(MBU)对系统运行的影响。

  为了提高系统测试的效率,使故障快速出现,IFIMK针对常用的系统调用测试,有do_fork,do_execve,do_exit,do_time,do_signal等。这样,测试人员可有针对性的对特定系统调用进行调用,以使故障尽快被触发,减少其潜伏时间。实验证明,这种方法是可行且高效的。

  对目标指令的选择,也尽可能全面,有条件转移指令je,无条件转移指令call,栈操作指令push,数据传送指令mov,逻辑运算指令xor等。

  4.3结果分析

  本次实验共注入2064个故障,其中指令故障为384个,运行环境故障为1680个,下面通过3个统计表说明本次实验中故障模式对系统失效率的影响。

  (1)实验中,向指令和运行环境注入故障数分别为1680和384,系统失效数及失效率统计如表2所示。由统计数据可知,指令发生故障的失效率远高于运行环境中各个寄存器发生故障的失效率。

  (2)实验共定义了6种类型的故障,每种故障均向内核注入280个,系统失效数及失效率统计如表3所示。由统计数据可知,发生故障的位越多,系统的失效率越高。

  (3)实验向ss,sp,cs,gs,fs,es,ds,ax,bp,di,si,dx,cx和bx等14个寄存器中注入故障,注入故障数?

  均为120,系统失效数及失效率统计如表4所示。由统计数据可知,段寄存器发生故障的失效率高于通用寄存器发生故障的失效。数据寄存器的故障可能导致运行结果的错误,但是段寄存器的故障往往会造成越界、空指针等严重问题。

  实验结果表明,引起的内核失效率要视具体情况而定,向指令中注入故障,系统大多数情况下会失效。向运行环境中注入故障不_定会引起系统的失效,运行环境包含了14个寄存器的内容,程序运行时没有用到注入故障的寄存器则不会引发错误,有些寄存器故障仅仅会导致结果的错误,但不会对系统的安全性造成影响,有些数据可能会直接引起系统死机。根据实验数据可知,指令故障的失效率高于寄存器故障的失效率;段寄存器故障的失效率高于通用寄存器故障的失效率;故障越严重,系统的失效率越高。

  5结束语

  通过对Linux内核、Kprobe机制及相关方面的研究,本文提出了IFIMK方法实现对Linux内核的故障注入,该方法是一种指令级的故障注入方法,能够将故障注入位置细化到内核的具体指令,是系统可靠性评测的_种有效手段。在该方法的基础上,本文对各种故障引起的失效率进行了统计,通过实验数据分析了故障类型、故障位置等因素对系统失效率的影响。

  下一步将研究在故障注入导致系统崩溃后,如何使系统自动采集故障信息并将系统恢复到故障注入之前的状态,从而避免再次从BIOS加载内核镜像和故障注入模块,节省系统启动和模块加载的时间。

  参考文献

  [1]车建华,何钦铭,陈建海,等.基于软件模拟的虚拟机系统故障插入工具J.浙江大学学报:工学版,2011,45(4):614-620.

  [2]吉岡弘隆,大和一洋,大岩尚宏,等.DebugHacks中文版:深入调试的技术与工具M].马晶慧,译.北京:电子工业出版社,2011.

  [3]HanS,ShinKG.ExperimentalEvaluationofFailure-detectionSchemesinReal-timeCommunicationNetworks

  [C]//Proceeingsofthe27thAnnualInter-lationalSymposiumonFault-tolerantComputing.WashingtonD.C./USA:IEEEPress,1997:122-431.

  [4]CarreiraJ,MadeiraH,SilvaJG.Xception:ATechniquefortheExperimentalEvaluationofDependabilityinModernComputers[J].IEEETransactionsonSoftwareEngineering,1998,24(2)1125-136.

  [5]SchroederB,GibsonGA.ALarge-scaleStudyofFailuresin

  High-performanceComputingSystems[J].IEEETransactionsonDependableandSecureComputing,2010,7(4):337-350.

  [6]徐晓露.基于故障注入的嵌入式系统测试研究[D].杭州:浙江大学,008.

  [7]BarbosaR,SilvaN,DuraesJ,etal.VerificationandValidationof(RealTime)COTSProductsUsingFaultInjectionTechniques[C]//Proceedingsofthe6thInternationalIEEEConferenceonCommercial-off-the-Shelf(COTS)-basedSoftwareSystems.WashingtonD.C.,USA:IEEEPress,2007:233^42.

  [8]Lopez-OngilC,EntrenaL,Garcia-ValderasM,etal.AUnifiedEnvironmentforFaultInjectionatAnyDesignLevelBasedonEmulation[J].IEEETransactionsonNuclearScience,2007,54(4):946-950.

  9]BlancS,GraciaJ,GilP.AFaultHypothesisStudyonthe

  TTP/CUsingVHDL-basedandPin-levelFaultInjectionTechniques[C]//Proceedingsofthe17thIEEEInternationalSymposiumonDefectandFaultToleranceinVLSISystems.WashingtonD.C.,USA:IEEEPress,2002:254462.

  [10]潘庆和.软件故障注入关键技术研究[D].哈尔滨:哈尔滨工业大学,2011.

  [11]王波.高端容错计算机故障注入工具的设计与实现[D].哈尔滨:哈尔滨工业大学,2011.

  12]ArlatJ,AgueraM,AmatL,etal.FaultInjectionforDependabilityValidationIAMethodologyandSomeApplications[J].IEEETransactionsonSoftwareEngineering,1990,6(2):166482.

  13]杨燚.Linux下的_个全新的性能测量和调式诊断工具Systemtap,第1部分:KprobeEB/OL].2014-06^8].httpI//www.ibm.com/developerworks/cn/Linux/l-cn-systemtap1/index.html.

  14]陈锦富,卢炎生,谢晓东.软件错误注入测试技术研究〇].软件学报,2009,20(6):14254443.


www.fabiaoba.com),是一个专门从事期刊推广期刊发表、投稿辅导、发表期刊的网站。
  本站提供如何投稿辅导、发表期刊,寻求论文刊登合作,快速投稿辅导,投稿辅导格式指导等解决方案:省级论文刊登/国家级论文刊登/ CSSCI核心/医学投稿辅导/职称投稿辅导。

投稿邮箱:fabiaoba365@126.com
 在线咨询: 投稿辅导275774677投稿辅导1003180928
 在线咨询: 投稿辅导610071587投稿辅导1003160816
 联系电话:18796993035

联系方式
李老师QQ:发表吧客服610071587 陈老师QQ:发表吧客服275774677 刘老师QQ:发表吧客服1003160816 张老师QQ:发表吧客服1003180928 联系电话:18796993035 投稿邮箱:fabiaoba365@126.com
期刊鉴别
  • 刊物名称:
  • 检索网站:
热门期刊
发表吧友情提醒

近来发现有些作者论文投稿存在大量剽窃、抄袭行为,“发表吧”对此类存在大量剽窃、抄袭的论文已经停止编辑、推荐。同时我们也提醒您,当您向“发表吧”投稿时请您一定要保证论文的原创性、唯一性,这既是对您自己负责,更是对他人的尊敬。

此类投稿的论文如果发表之后,对您今后的人生和事业将造成很大的麻烦,后果不堪设想,请您一定要慎重,三思而后行。

如因版权问题引起争议或任何其他原因,“发表吧”不承担任何法律责任,侵权法律责任概由剽窃、抄袭者本人承担。

 
QQ在线咨询
论文刊登热线:
137-7525-9981
微信号咨询:
fabiaoba-com

友情链接

申请链接