Linux中核外进程恢复的策略和实现.docVIP

Linux中核外进程恢复的策略和实现.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE PAGE 1 Linux中核外进程恢复的策略和实现   摘要:Linux核外进程恢复可采用先产生原进程整体构架,再恢复断点信息的方法来实现。即用进程中断时的上下文结合相应的恢复代码,与原可执行文件一起产生一个新文件,使该文件在产生原进程整体构架后,就执行恢复代码,恢复出断点处的上下文,然后从断点处继续原来进程的执行。   关键词:检查点机制;进程恢复;进程迁移;Linux   中图分类号:TP3文献标识码:A文章编号:1009-3044(2013)05-1147-02   目前,国内外已对进程迁移做了较多的研究。有通过修改操作系统内核实现进程迁移机制的系统,如:MOSIX、Charlotte、V、Sprite和Mach等;也有在用户层实现进程迁移机制的系统,如:Condor、PRM、UPVM、DQS等。在这些已实现的进程迁移机制当中,其大部分是基于检查点机制来实现的。即在迁移进程之前,把进程的状态数据保存到检查点文件,然后把该检查点文件转移到另外的节点上,待目标节点收到整个检查点文件后,再根据检查点文件重新恢复迁移进程。   我们对进程迁移的研究也是基于Linux的检查点机制,并在此基础上实现了核外的进程恢复,进而实现进程迁移。   在要恢复的部分系统上下文中包括:进程描述符、内存描述符、文件描述符等内核数据,但是这些内容是没有必要被原样恢复的。因为恢复这些系统上下文的目的在于保持进程与文件的映射关系以及获得运行所需的内存资源,但这不是非得原样恢复原来的系统上下文才能做得到,可以通过让系统重新加载原可执行文件来自动完成。虽然这些内核数据与原来的不一样,但是当系统完成加载映射后,用户地址空间的安排和内核数据的分配已经完成,磁盘文件和内存虚拟空间也关联起来,形成了原来进程运行的基本框架。   而恢复用户上下文和寄存器上下文目的在于保证迁移进程与原进程中断时候数据的一致性,这也就是要恢复进程断点处全局变量和局部静态变量的值、堆栈的内容以及寄存器的内容。通过对ELF可执行文件及其执行过程的分析可以看到,对这部分信息的恢复,可以考虑在进程跳转到程序起始地址的时候,先让其执行一段恢复代码来恢复断点时候的数据信息,然后再跳转到断点处开始执行。   因此,整个构建新可执行文件的工作,可以由数据段的恢复、堆栈及寄存器的恢复、文件调整这几步来完成。   1数据段的恢复   根据以上的分析,考虑到在整个进程的执行过程中,textsegment无论怎样都是不变的,所以直接引用原可执行文件的textsegment。对于datasegment,要考虑的有两个地方,一个是.datasection,一个是.bsssection,这两个地方分别存放的是已初始化和未初始化的全局变量、局部静态变量,进程在运行过程中可能会对其进行修改,故要用检查点文件(core)中对应的.data和.bsssection来做恢复。而datasegment的其他部分是和动态链接有关的,它们是提供给动态链接器在动态符号解析和重定位的时候使用的,用户程序在执行过程中不会对其进行修改,所以重新加载原文件后,这部分设置已经正确,没有必要修改了。   于是,我们仍然是直接引用原可执行文件的datasegment,再把检查点文件中对应.data和.bsssection的内容拷贝到新的可执行文件中。待新的可执行文件被加载到内存后,再用repmovsd指令把其复制到对应位置,这也就恢复了进程中断时的全局变量和局部静态变量的值。在拷贝.datasection和.bsssection的时候,都要记录下该数据被加载后的源地址、要恢复的目标地址、以及整个内容有多少双字大小,为使用repmovsd指令做准备。   动态共享库是用户进程不可或缺的一部分。在Linux中,动态共享库也是ELF格式,所以可以采用恢复用户程序的方法来对动态共享库做调整。也就是要对共享库的.datasection和.bsssection做恢复,因为共享库是存在于用户空间,当在执行恢复代码的时候,已经完成了映射和重定位,直接对其内容做操作是可行的。   在对动态共享库的处理中,确定共享库的.data和.bsssection在检查点文件中的对应部分,要稍微复杂些。这首先得从原可执行文件中找出所依赖的共享库,读取sectionheadertable进而确定.datasection、.bsssection与datasegment的相对位置关系,然后根据这个相对关系,再在检查点文件中找到保存该共享库datasegment的位置,从中提取出.data和.bsssection的内容,写到新的可执行文件中。   当所有相关内容都被提取后,接下来就要插入repmovsd等指令的机器码,来操作刚才这些数据,完成在运行的时候对目标虚拟地址

文档评论(0)

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

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

版权声明书
用户编号:5243141323000000

1亿VIP精品文档

相关文档