面向硬件不可恢复内存故障的内核代码软容错方法转让专利

申请号 : CN201110341733.8

文献号 : CN102508742B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 秦莹刘晓建戴华东吴庆波孔金珠颜跃进

申请人 : 中国人民解放军国防科学技术大学

摘要 :

本发明公开了一种面向硬件不可恢复内存故障的内核代码软容错方法,其实施步骤如下:1)在操作系统将内核代码加载至物理内存时,将内核代码标记为主代码,为每段内核代码设置多份代码副本并加载至物理内存中;2)在操作系统运行时,如果内核代码所在内存遇到内存异常则定位当前主代码的出错内核页,将出错内核页代码与代码副本进行比较,如果确定出错内核页的代码发生错误,则暂停计算机运行,修改出错内核页的内核代码页表,从当前主代码对应的代码副本中选择一份正常的代码副本代替当前主代码,然后继续运行计算机。本发明能够提高操作系统运行的稳定性、增强内核模块可靠性、降低内存出错可能性,减少内存故障对操作系统运行的干扰。

权利要求 :

1.一种面向硬件不可恢复内存故障的内核代码软容错方法,其特征在于其实施步骤如下:

1)在操作系统将内核代码加载至物理内存时,将所述内核代码标记为主代码,为每段所述内核代码设置多份代码副本并将代码副本加载至物理内存中;

2)在操作系统运行时,如果内核代码所在的内存遇到内存异常则定位当前主代码的出错内核页,将出错内核页的代码与当前主代码对应的代码副本进行比较,如果确定为出错内核页的代码发生错误,则暂停计算机运行,修改所述出错内核页的内核代码页表,从当前主代码对应的代码副本中选择一份正常的代码副本代替当前主代码,然后继续运行计算机;所述定位当前主代码的出错内核页的具体步骤包括:首先检测内存异常类型,如果内存异常类型为同步感知故障,则直接根据异常错误信息包含的内存硬件地址信息定位出错内核页;如果内存异常类型为异步感知故障,则在当前执行栈中通过检查调用指令进行迭代栈回退定位出错内核页。

2.根据权利要求1所述的面向硬件不可恢复内存故障的内核代码软容错方法,其特征在于,所述在当前执行栈中通过检查调用指令进行迭代栈回退定位出错内核页的具体步骤包括:A)将迭代次数清零;

B)检查当前执行栈,如果当前执行栈中子例程的入口地址包括当前主代码的内存地址,则将所述内存地址处的主代码和相应的代码副本进行特征比较,如果匹配则定位出错内核页成功;如果均不匹配则检查栈历史中已执行的代码是否包含I/O指令或者写指令,如果存在I/O指令或者写指令则转入步骤D),如果不存在I/O指令或者写指令则转入步骤C);

C)检查迭代次数,如果迭代次数没有到达迭代上限则回退到上一级栈帧,迭代次数增加一次并继续跳转执行步骤B);否则如果迭代次数到达上限,跳转执行步骤D);

D)停止故障处理过程并结束查找。

3.根据权利要求1所述的面向硬件不可恢复内存故障的内核代码软容错方法,其特征在于:所述步骤1)中将代码副本加载至物理内存中时,所述加载的代码副本数量N为N=2f+1,其中f为大于0的整数。

4.根据权利要求3所述的面向硬件不可恢复内存故障的内核代码软容错方法,其特征在于:所述步骤1)中将代码副本加载至物理内存中时,所述加载至物理内存中的代码副本分别分散存储于物理内存中。

5.根据权利要求1所述的面向硬件不可恢复内存故障的内核代码软容错方法,其特征在于,所述步骤2)中在操作系统运行时还包括内核代码检查维护的步骤,所述内核代码检查维护的步骤包括:在操作系统空闲状态时启动内核代码比较线程,将各内核模块的主代码和与其对应的代码副本进行比较,根据所述比较结果对当前主代码对应的代码副本进行检查维护,且根据所述比较结果对当前主代码的状态进行判断,如果主代码发生错误,则暂停计算机运行,选择一份正常的代码副本替代操作系统的主代码,然后继续运行计算机。

6.根据权利要求5所述的面向硬件不可恢复内存故障的内核代码软容错方法,其特征在于,所述将内核模块的各主代码和与其对应的各代码副本进行比较的具体步骤包括:Ⅰ)选定一个代码副本作为主代码副本,遍历查找比较主代码和主代码副本之间的差异;

Ⅱ)如果主代码和主代码副本之间无差异,则判定主代码正常,比较结束;如果主代码和主代码副本之间有差异,则将其他的代码副本作为从代码副本依次与主代码进行比较、将主代码副本依次与各从代码副本进行比较,如果主代码和主代码副本、各从代码副本均不一致,则判定主代码出错;如果所述主代码副本与主代码、各从代码副本均不一致,则判定主代码副本出错。

7.根据权利要求6所述的面向硬件不可恢复内存故障的内核代码软容错方法,其特征在于,所述根据所述比较结果对当前主代码对应的代码副本进行检查维护具体包括:如果所述比较结果得出主代码副本出错,则选择一份正常的从代码副本替代作为当前的主代码副本。

8.根据权利要求1~7中任意一项所述的面向硬件不可恢复内存故障的内核代码软容错方法,其特征在于,所述步骤2)中在操作系统运行时还包括内核代码定期替换的步骤,所述内核代码定期替换具体是指:在内核代码的当前主代码运行正常的情况下,定时暂停计算机运行,对当前主代码对应的代码副本进行检查维护,从当前主代码对应的代码副本中轮流选择一份正常的代码副本代替当前主代码,然后继续运行计算机。

说明书 :

面向硬件不可恢复内存故障的内核代码软容错方法

技术领域

[0001] 本发明涉及操作系统内核代码运行时的容错方法,具体涉及一种是通过软件来缓解硬件不可恢复内存故障对操作系统本身运行稳定性影响的容错方法。

背景技术

[0002] 从1946年首台计算机出现至今,计算机系统一直采用存储指令的冯.诺依曼结构。在冯.诺依曼结构下,指令作为数据存储在内存中,处理器从内存中获取指令并逐条译码执行。进入后CMOS时代后,由于芯片中晶体管密度持续增加,芯片老化和放射性引发单粒子翻转(single event updates,SEU)等内存软故障(soft error)的情况日益增多,容易导致存储指令的内存出现故障,极可能引发严重的逻辑错误,给计算机用户带来灾难性后果。
[0003] 为增加计算机系统中内存的可靠性,硬件设计者目前一般采用奇偶校验、ECC纠错、Chipkill技术来提高计算机系统对内存单位错、多位错的查错和纠错能力。但是,由于ECC较验和Chipkill技术对计算机性能的影响较大并且其技术实现代价昂贵,这些先进的硬件纠容错技术目前主要应用于高档服务器系统中;另一方面,即便是采用上述纠错方法,硬件内存故障仍然是无法完全避免的,目前大量商用计算机系统中硬件内存故障仍然是影响系统可靠运行的主要因素。
[0004] 计算机系统中内存硬件纠错机制仍然无法避免的内存故障统称为“硬件不可恢复内存故障”。硬件不可恢复内存故障对计算机系统产生的影响表现为两类:一类为同步感知故障(一类故障),即可被同步感知到的机器异常(Exception)。例如,当内存出现奇偶校验错误时,会引发一个不可屏蔽中断(NMI,Non-Maskable Interrupt),将一个机器检测故障(MCE,Machine Check Error)报告给操作系统进行处理;另一类是异步感知故障,即异步的硬件不可见故障(二类故障)。例如,在奇偶校验等硬件纠错机制无法处理甚至无法感知到的内存故障发生时,由于硬件不具备发现内存故障的能力,因此不会报告异常,但是内存中的数据已经发生了改变,处理器会取得被修改后的指令执行,运行将会持续、直到产生可见的逻辑错误:如非法指令或是内存地址访问异常,此时计算机才会获得错误的提示。这种硬件故障引发的程序错误,因和果是异步的,因此隐蔽性很强。 操作系统内核代码是计算机系统中运行频度最高的代码之一,内核代码出现错误将会影响到整个系统的正常运行,由于硬件不可恢复的内存故障的存在,直接对操作系统内核代码运行产生影响,影响计算机系统的稳定性和可靠性。

发明内容

[0005] 针对上述现有技术的缺点,本发明要解决的技术问题是提供一种能够缓解硬件不可恢复内存故障对操作系统带来的影响,提高操作系统运行的稳定性、增强内核模块可靠性、降低内存出错可能性以及对操作系统运行干扰的面向硬件不可恢复内存故障的内核代码软容错方法。
[0006] 为了解决上述技术问题,本发明采用的技术方案为:一种面向硬件不可恢复内存故障的内核代码软容错方法,其实施步骤如下:
[0007] 1)在操作系统将内核代码加载至物理内存时,将所述内核代码标记为主代码,为每个所述内核代码设置多份代码副本并将代码副本加载至物理内存中;
[0008] 2)在操作系统运行时,如果内核代码所在的内存遇到内存异常则定位当前主代码的出错内核页,将出错内核页的代码与当前主代码对应的代码副本进行比较,如果确定为出错内核页的代码发生错误,则暂停计算机运行,修改所述出错内核页的内核代码页表,从当前主代码对应的代码副本中选择一份正常的代码副本代替当前主代码,然后继续运行计算机。
[0009] 作为本发明上述技术方案的进一步改进:
[0010] 所述步骤2)中定位当前主代码的出错内核页的具体步骤包括:首先检测内存异常类型,如果内存异常类型为同步感知故障,则直接根据异常错误信息包含的内存硬件地址信息定位出错内核页;如果内存异常类型为异步感知故障,则在当前执行栈中通过检查调用指令进行迭代栈回退定位出错内核页。
[0011] 所述在当前执行栈中通过检查调用指令进行迭代栈回退定位出错内核页的具体步骤包括:
[0012] A)将迭代次数清零;
[0013] B)检查当前执行栈,如果当前执行栈中子例程的入口地址包括当前主代码的内存地址,则将所述内存地址处的主代码和相应的代码副本进行特征比较,如果匹配则定位出错内核页成功;如果均不匹配则检查栈历史中已执行的代码是否包含I/O指令或者写指令,如果存在I/O指令或者写指令则转入步骤D),如果不存在I/O指令或者写指令则转入步骤C);
[0014] C)检查迭代次数,如果迭代次数没有到达迭代上限则回退到上一级栈帧,迭代次数增加一次并继续跳转执行步骤B);否则如果迭代次数到达上限,跳转执行步骤D);
[0015] D)停止故障处理过程并结束查找。
[0016] 所述步骤1)中将代码副本加载至物理内存中时,所述加载的代码副本数量N为N=2f+1,其中f为大于0的整数。
[0017] 所述步骤1)中将代码副本加载至物理内存中时,所述加载至物理内存中的代码副本分别分散存储于物理内存中。
[0018] 所述步骤2)中在操作系统运行时还包括内核代码检查维护的步骤,所述内核代码检查维护的步骤包括:在操作系统空闲状态时启动内核代码比较线程,将各内核模块的主代码和与其对应的代码副本进行比较,根据所述比较结果对当前主代码对应的代码副本进行检查维护,且根据所述比较结果对当前主代码的状态进行判断,如果主代码发生错误,则暂停计算机运行,选择一份正常的代码副本替代操作系统的主代码,然后继续运行计算机。
[0019] 所述将内核模块的各主代码和与其对应的各代码副本进行比较的具体步骤包括:
[0020] Ⅰ)选定一个代码副本作为主代码副本,遍历查找比较主代码和主代码副本之间的差异;
[0021] Ⅱ)如果主代码和主代码副本之间无差异,则判定主代码正常,比较结束;如果主代码和主代码副本之间有差异,则将其他的代码副本作为从代码副本依次与主代码进行比较、将主代码副本依次与各从代码副本进行比较,如果主代码和主代码副本、各从代码副本均不一致,则判定主代码出错;如果所述主代码副本与主代码、各从代码副本均不一致,则判定主代码副本出错。
[0022] 所述根据所述比较结果对当前主代码对应的代码副本进行检查维护具体包括:如果所述比较结果得出主代码副本出错,则选择一份正常的从代码副本替代作为当前的主代码副本。
[0023] 所述步骤2)中在操作系统运行时还包括内核代码定期替换的步骤,所述内核代码定期替换具体是指:在内核代码的当前主代码运行正常的情况下,定时暂停计算机运行,对当前主代码对应的代码副本进行检查维护,从当前主代码对应的代码副本中轮流选择一份正常的代码副本代替当前主代码,然后继续运行计算机。
[0024] 本发明具有下述优点:
[0025] 1、本发明中为每个主代码设置并同时加载与之对应的多份代码副本,在物理内存发生异常错误时,从当前主代码对应的代码副本中选择一份正常的代码副本代替当前主代码被执行。通过上述方法,能够有效缓解存储内核代码的内存出现硬件不可恢复故障时对操作系统运行的影响,提高操作系统运行的稳定性、增强内核模块可靠性、降低内存出错可能性以及对操作系统运行干扰。
[0026] 2、本发明进一步进行异常错误类型的检测,通过判断同步感知故障和异步感知故障两种不同的故障,准确、快速定位出错内核页;并直接对发生故障内核页所在的主代码进行替换,将正常的代码副本作为新的主代码执行,能够快速实现内存发生同步感知故障和异步感知故障的处理。而且针对异步感知故障执行栈现场往往不是发生错误的内核页运行现场的问题,本发明进一步在当前执行栈中通过检查调用指令进行迭代栈回退的方法来定位出错内核页,即通过一步步迭代栈回退找到发生错误的内核页运行现场,就能够解决异步感知故障内核页定位困难的问题,而且本发明采用内核代码多副本在线替换的异步容错方法,结合执行栈回退和内核代码多副本比较相结合的同步纠错方法,能够纠正同步感知故障和异步感知故障造成的错误,减轻不可恢复故障在计算机运行时对操作系统的干扰。
[0027] 3、本发明进一步将代码副本加载至物理内存中时,加载的代码副本数量N为N=2f+1,该多代码副本机制能够容忍f处内核代码内存故障,避免由于一份代码副本出现故障而影响代码副本的使用;本发明进一步将代码副本加载至物理内存中时,加载至物理内存中的代码副本分别分散存储于物理内存中,因此能够保证即使某一个物理内存条损坏也不易同时影响到多个代码副本,可靠性更好。
[0028] 4、本发明进一步包括内核代码检查维护的步骤,内核代码检查维护通过在操作系统空闲状态时启动内核代码比较线程,使用代码副本及时替代发生错误的主代码,能够尽可能早地发现内存错误,能够避免由于内存错误导致后期的运行错误;本发明进一步将内核模块的主代码和与其对应的代码副本进行比较,能够简单而又有效识别出主代码、主代码副本出错的情况,并在主代码副本出错时进行主代码副本维护,使主代码副本与从代码副本一致,能够容忍并自动维护代码副本故障。
[0029] 5、本发明进一步在操作系统运行时还包括内核代码定期替换的步骤,通过内核代码定期替换可以减少对单个内存代码副本的访问频率,从而降低内核内存出现硬件不可恢复故障的可能性。

附图说明

[0030] 图1为本发明实施例在操作系统运行中的应用流程示意图。
[0031] 图2为本发明实施例内存异常处理逻辑的流程示意图。
[0032] 图3为本发明实施例同步可感知处理的流程示意图。
[0033] 图4为本发明实施例异步可感知处理的流程示意图。
[0034] 图5为本发明实施例内核代码检查维护的详细流程示意图。
[0035] 图6为本发明实施例代码副本替换主代码的流程示意图。
[0036] 图7为本发明实施例内核代码定期替换的流程示意图。

具体实施方式

[0037] 本发明实施例面向硬件不可恢复内存故障的内核代码软容错方法的实施步骤如下:
[0038] 1)在操作系统将内核代码加载至物理内存时,将内核代码标记为主代码,为每个内核代码设置多份代码副本并将代码副本加载至物理内存中;
[0039] 2)在操作系统运行时,如果内核代码所在的内存遇到内存异常则定位当前主代码的出错内核页,将出错内核页的代码与当前主代码对应的代码副本进行比较,如果确定为出错内核页的代码发生错误,则暂停计算机运行,修改出错内核页的内核代码页表,从当前主代码对应的代码副本中选择一份正常的代码副本代替当前主代码,然后继续运行计算机。
[0040] 如图1所示,其中步骤1)在操作系统启动后系统基础设施初始化之后、启动线程运行之前完成步骤1)的处理,即内核副本拷贝;在执行线程过程中,如果遇到内存异常信息则进入步骤2)的处理,即异常处理逻辑。操作系统的内核模块包含了基本功能代码和扩展功能代码,内核模块具有天然模块性,内核代码是按照模块为粒度存储在不同的物理内存块中的,因此步骤1)中内核副本拷贝也按照内核模块为粒度进行。为了叙述清晰,本实施例中出现内核代码指可能存储在非连续物理区域的多块内核模块代码,对一块内核模块代码的处理过程可平行的用于各个内核模块代码。步骤1)中内核副本拷贝也包括启动时加载基本功能代码和按需加载扩展功能代码两类,步骤1)中的内核代码加载至物理内存既包括在操作系统启动之初将内核模块的基本功能代码加载至物理内存,也包括在系统运行过程中,按需加载扩功能代码加载至物理内存中。本实施例针对两类内核代码采用相同方法处理:在操作系统启动之初,加载基本功能代码作为主代码的同时加载基本功能内核代码的多个代码副本到一个以上的物理内存处;在系统运行过程中按需加载扩展功能代码时,加载扩展功能代码的同时也加在扩展功能代码的多个代码副本到一个以上的物理内存处。
[0041] 本实施例步骤1)中将代码副本加载至物理内存中时,加载的代码副本数量N为N=2f+1,其中f为大于0的整数,f可以由用户通过启动参数指定。当f等于1时,代码副本数目为3。标记为主代码的内核代码处于执行状态,代码副本均处于非执行状态,本实施例中采用f等于1的配置,3份代码副本中1份主代码副本和2份从代码副本。多份代码副本可以避免一份代码副本出现故障,例如当f等于1时代码副本数目为3,此时系统可容忍一份代码副本出现故障;当f等于2时,代码副本数目为5,此时系统可容忍两份代码副本出现故障,依此类推。将代码副本加载至物理内存中时,加载至物理内存中的代码副本分别分散存储于物理内存中,从而各代码副本应尽可能分散存储于物理内存中,保持所在的位置相互远离,能够保证一个物理内存故障不会影响到多个代码副本。
[0042] 步骤2)中定位当前主代码的出错内核页的具体步骤包括:首先检测内存异常类型,如果内存异常类型为同步感知故障,则直接根据异常错误信息包含的内存硬件地址信息定位出错内核页;如果内存异常类型为异步感知故障,则在当前执行栈中通过检查调用指令进行迭代栈回退定位出错内核页。本实施例中为了描述方便,将同步感知故障简称为一类故障,将异步感知故障简称为二类故障,计算机系统运行过程中出现一类故障时,操作系统会接收到一个NMI中断,本实施例中通过NMI中断来检测异常错误类型。如图2所示,操作系统检测到内存异常时,则暂停计算机运行,首先判断是否接收到NMI中断,如果接收到NMI中断且识别出此NMI中断确实是由于内存错导致,则判定发生一类故障并进入一类故障处理;否则判定发生二类故障并进入二类故障处理,然后在故障处理完毕后恢复现场并继续运行计算机。
[0043] 在一类故障处理过程中,首先定位处于执行状态的主代码的出错内核页,然后比较出错内核页的代码和当前主代码对应代码副本的代码是否一致,如果出现不一致,则采用内核代码段虚实映射重置的方法,通过修改内核代码段页表使用非故障内存处存放的内核代码页代替主代码执行。如图3所示,本实施例对于一类故障的具体处理步骤为: [0044] A1) 识别为内存错导致错误,暂停计算机运行;
[0045] A2) 根据硬件给出的内存地址信息确定到出错内核页;
[0046] A3) 比较该出错内核页的代码和当前主代码对应代码副本的代码是否一致,如果不一致转到步骤A5);如果一致则转入步骤A4);
[0047] A4) 如果一致,转入步骤A7);
[0048] A5) 重置虚实映射,使用正确的代码副本代替主代码执行;
[0049] A6) 更新各代码副本,使其保持一致;
[0050] A7) 结束。
[0051] 由于二类故障处理的异步特性,发生异常错误的执行栈现场不一定是出错内核页运行的现场,因此使用当前执行栈往往无法一次定位出错内核页,本实施例通过检查调用指令进行迭代栈回退定位可能发生异常错误的出错内核页。在计算机科学中,栈是用来存储计算机程序活跃子例程信息的一个数据结构。这种类型的栈也称为执行栈、控制栈、运行时栈或机器栈。栈中存储的信息包括活跃子例程执行结束之后需要转入的控制点。一个活跃的例程是指目前已经被调用,在其执行结束后需要将控制转回到调用处的一段运行实体。例如一个DrawSquare函数绘制一个矩形是通过四次调用Drawline函数绘制线段实现,DrawSquare函数分别在四处调用Drawline函数,Drawline函数必须知道每一次被调用执行结束后究竟返回到哪个点。为了实现这一功能,在每次执行调用之前,调用指令之后的地址被压入栈中作为返回地址。在栈中通过检查调用(关键字为call、jmp等)指令,可以确定我们可以清楚地回溯子例程之间的调用和执行先后顺序以及子例程的入口地址,也为定位比较代码的地址提供了事实的依据。
[0052] 如图4所示,本实施例对于二类故障处理中在当前执行栈中通过检查调用指令进行迭代栈回退定位出错内核页的具体步骤包括:
[0053] A)将迭代次数清零;
[0054] B)检查当前执行栈,如果当前执行栈中子例程的入口地址包括当前主代码的内存地址,则将内存地址处的主代码和相应的代码副本进行特征比较,如果匹配则定位出错内核页成功;如果均不匹配则检查栈历史中已执行的代码是否包含I/O指令或者写指令,如果存在I/O指令或者写指令则转入步骤D),如果不存在I/O指令或者写指令则转入步骤C);
[0055] C)检查迭代次数,如果迭代次数没有到达迭代上限则回退到上一级栈帧,迭代次数增加一次并继续跳转执行步骤B);否则如果迭代次数到达上限,跳转执行步骤D);
[0056] D)停止故障处理过程并结束查找。
[0057] 在上述过程中如果迭代次数达到上限,则报硬件不可恢复错;如果主代码段包含产生副作用的指令(I/O指令或者写指令),则报软件不可恢复错,硬件不可恢复错和软件不可恢复错均不进行主从代码替换。
[0058] 除上述一类故障和二类故障处理以外,本实施例还包括一类故障和二类故障的规避处理。避免内存故障对操作系统运行影响的途径有两个,一种是减少对该块内存的访问次数,以减少内存损耗引发内存故障;另外一个是提前确定出现故障的内存。本实施例在步骤2中采用以下两种措施来减少对操作系统内核代码的出错可能性和影响:
[0059] 1、内核代码检查维护。
[0060] 内核代码检查维护用于确保将被执行的内核代码所在的内存处于健康状态。本实施例步骤2)中在操作系统运行时还包括内核代码检查维护的步骤,内核代码检查维护的步骤包括:在操作系统空闲状态时启动内核代码比较线程,将各内核模块的主代码和与其对应的代码副本进行比较,根据比较结果对当前主代码对应的代码副本进行检查维护,且根据比较结果对当前主代码的状态进行判断,如果主代码发生错误,则暂停计算机运行,选择一份正常的代码副本替代操作系统的主代码,然后继续运行计算机,此时需要向系统管理记录报告错误情况,并禁止异步的代码检查功能。其中,将内核模块的各主代码和与其对应的各代码副本进行比较的具体步骤包括:
[0061] Ⅰ)选定一个代码副本作为主代码副本,遍历查找比较主代码和主代码副本之间的差异;
[0062] Ⅱ)如果主代码和主代码副本之间无差异,则判定主代码正常,比较结束;如果主代码和主代码副本之间有差异,则将其他的代码副本作为从代码副本依次与主代码进行比较、将主代码副本依次与各从代码副本进行比较,如果主代码和主代码副本、各从代码副本均不一致,则判定主代码出错;如果主代码副本与主代码、各从代码副本均不一致,则判定主代码副本出错。
[0063] 本实施例中,根据比较结果对当前主代码对应的代码副本进行检查维护具体包括:如果主代码副本出错则选择一份正常的从代码副本替代作为当前的主代码副本,选择一份正常的从代码副本时,可以将多份从代码副本进行比较以获取正常的从代码副本,本实施例中f等于1时代码副本数目为3,系统可容忍一份从代码副本出现故障。
[0064] 本实施例在步骤Ⅰ)和步骤Ⅱ)中实现了对主代码、主代码副本的检查,步骤Ⅱ)中将其他的代码副本作为从代码副本继续与主代码、主代码副本进行比较后,如果主代码副本出错,则选择一份正常的代码副本替代作为当前的主代码副本,从而实现对主代码副本的纠错。如图5所示,本实施例中将内核模块的各主代码和与其对应的各代码副本进行比较的具体步骤包括:
[0065] B1) 选定一个代码副本作为主代码副本,其余的代码副本则作为从代码副本,然后通过代码指针p的递增来实现遍历查找内核主代码M1和主副本代码M2存在不一致错误,记录下错误数N和每处地址和主代码和主副本代码的内容,记为数组E[N-1],其中E[N-1]的每项记录了不一致出现地址E[N].p、主代码内容E[N]. M1、主副本代码E[N]. M2内容;
[0066] B2) 如果N为0,表明未出现不一致错误,转入步骤B7);
[0067] B3) 通过变量i来遍历数组E[N-1],对照副本代码和数组E[N-1]的内容:在将从代码副本M3[p]继续与主代码E[N]. M1进行比较时,如果从代码副本M3[p]等于主代码E[N]. M1,则判定主代码副本出错,主代码副本错误数加1;如果从代码副本M3[p]不等于主代码E[N]. M1,则先判定主代码出错,主代码错误数加1,然后进一步比较主代码副本E[N]. M2和从代码副本M3[p],如果主代码副本E[N]. M2不等于从代码副本M3[p]则判定从代码副本M3[p]出错,从代码副本错误数加1;如果主代码E[N]. M1、主副本代码E[N]. M2、从代码副本M3[p]三者皆不匹配,表明出现了无法恢复的错误,主代码错误数加一,主副本代码数加一;
[0068] B4) 如果主代码错误数N大于零,转入步骤B5);如果主代码错误数N等于零,转入步骤B6);
[0069] B5) 如果主副本代码错误数等于零,报主代码错误,进行主从代码替换,使用主副本代码替换主代码运行,进行主副本的维护使其与从副本一致,转入B7)结束;如果主副本代码错误数大于零,报严重错误,转入步骤B7);
[0070] B6) 如果主副本代码错误数大于零,报主副本代码错误,进行主副本的维护使其与从副本一致,转入步骤B7);如果主副本代码错误数等于零,此类情况不应出现,转入步骤B7);
[0071] B7) 结束。
[0072] 将内核模块的各主代码和与其对应的各代码副本进行比较完毕后:如果主代码错误数为0且主代码副本错误所大于0,此类情况不应出现,直接结束处理;如果主代码错误数为0且主代码副本错误所等于0,则更新主副本代码,从选择一个正常的从副本代码替换主副本代码,然后结束处理;如果主代码错误数大于0且主代码副本错误所等于0,则使用主副本代码替换主代码运行,进行主副本的维护使其与从副本一致,然后结束处理;如果主代码数大于零且从副本代码大于零,则报严重错误,然后结束处理,此时建议停机修整。如图6所示,替代操作系统的主代码的代码副本替换流程为:如果发生了主代码与代码副本不一致错误,则重置虚实映射,使用正确的代码副本替换主代码,然后替换结束。
[0073] 2、内核代码定期替换
[0074] 通过内核代码定期替换的方法,能够减少对每个内核代码页内存副本的使用次数。本实施例步骤2)中在操作系统运行时还包括内核代码定期替换的步骤,内核代码定期替换具体是指:在内核代码的当前主代码运行正常的情况下,定时暂停计算机运行,对当前主代码对应的代码副本进行检查维护,从当前主代码对应的代码副本中轮流选择一份正常的代码副本代替当前主代码,然后继续运行计算机。本实施例中,通过对代码副本进行检查维护的目的是获取一份正常的主代码副本,并将正常的主代码副本代替当前主代码。内核代码定期替换是通过图1中的定时中断的中断处理逻辑实现的。在主内核副本运行一定时间(由系统程序员确定)之后,如果一直未出现主内核副本、从内核副本不一致错误,采用系统提供的暂停机制停止系统的执行。启动内核代码副本替换过程,将正在运行的内核代码副本进行主从替换操作。运行时间间隔可以由系统管理员通过系统控制参数指定。如图7所示,内核代码定期替换具体的步骤为:
[0075] C1) 首先通过内核代码检查维护定时器进行定时检查,如果内核代码检查维护定时器定时未到,则判断用于执行内核代码定期替换的定时器是否到时,如果定时器到时则转入到步骤C2)的处理函数入口处,否则如果内核代码检查维护定时到时则启动内核代码检查维护线程;
[0076] C2) 检查主代码副本和从代码副本,判断是否发生了代码副本不一致错误,如果没有代码副本不一致错误则转入执行步骤C3),否则转入执行步骤C4);
[0077] C3) 重置内核页虚实映射,选择一个代码副本替换当前主代码执行;
[0078] C4) 处理过程结束。
[0079] 以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。