经验之一:用“软件陷阱+程序口令”对付PC指针的弹飞 当CPU受到外界干扰,有时PC指针会飞到另一段程序中,或跳到空白段去。其实,如果PC指针飞到空白段去,倒也好处理。只要在空白段设立软件陷阱(拦截指令),将程序拦截到初始化段或程序错误处理段。但是,如果PC指针飞到另一段程序中去了,系统如何办?小匠在这里推荐一种方法——程序口令,思路如下:
1、首先,程序必须模块化。每个模块(子程序)执行一个功能。每个模块只有一个出口(RET)。
2、设立一个模块(子程序)ID寄存器。
3、为每个子程序配置一个唯一的ID号码。
4、每当子程序执行完毕,要返回(RET)之前,
先将本子程序的ID号送入 ID寄存器。
5、返回到上级程序后,先判断ID寄存器中的ID号。
如果正确,则继续执行;如果不正确,则表示PC指针有可能已经跳错了,子程序没有按预计的出口返回,这时将程序拦截到初始化段或程序错误处理段。
这种方法,如同在程序中设立了若干个岗哨,每次调用子程序返回后,都要对口令(ID号),验明正身后再放行。再配合软件陷阱,基本上可以将大多数PC指针弹飞的现象检测到。到了程序错误处理段,要杀要剐(冷启动还是热启动)就由您了。
经验之二、不要轻信软件狗 关于软件狗的讨论,论坛上多矣。匠人也曾经查阅过许多关于软件狗的文章。有些大师确实提出了一些比较有技巧性的方法。但是,匠人的忠告是:不要轻信软件狗!其实,软件狗相当于软件的一种自律行为。一般的思路都是通过设立一个计数器,在计时中断中对其+1,在主程序的适当地方对其清零。如果程序失控了,清零指令未被执行,但中断造常发生,则计数器溢出(狗狗叫了)。但是这里有个问题:万一干扰导致中断被屏蔽了,那软件狗就永远不会叫了!——针对这种可能,有人提出在主程序中反复刷新中断使能标志,保证不让中断被屏蔽。——但万一程序飞到某个死循环中去了,不再执行“刷新中断使能标志”这一功能了,还是有可能把狗狗活活饿死。
xucun915_925777961 2011-8-18 13:24