[其他] 用“软件陷阱+程序口令”对付PC指针的弹飞

[复制链接]
 楼主| usysm 发表于 2025-7-23 16:37 | 显示全部楼层 |阅读模式
用“软件陷阱+程序口令”对付PC指针的弹飞
当CPU受到外界干扰,有时PC指针会飞到另一段程序中,或跳到空白段去。其实,如果PC指针飞到空白段去,倒也好处理。只要在空白段设立软件陷阱(拦截指令),将程序拦截到初始化段或程序错误处理段。但是,如果PC指针飞到另一段程序中去了,系统如何办?小匠在这里推荐一种方法——程序口令,思路如下:
1、首先,程序必须模块化。每个模块(子程序)执行一个功能。每个模块只有一个出口(RET)。
2、设立一个模块(子程序)ID寄存器。
3、为每个子程序配置一个唯一的ID号码。
4、每当子程序执行完毕,要返回(RET)之前,先将本子程序的ID号送入 ID寄存器。
5、返回到上级程序后,先判断ID寄存器中的ID号。
如果正确,则继续执行;如果不正确,则表示PC指针有可能已经跳错了,子程序没有按预计的出口返回,这时将程序拦截到初始化段或程序错误处理段。
这种方法,如同在程序中设立了若干个岗哨,每次调用子程序返回后,都要对口令(ID号),验明正身后再放行。再配合软件陷阱,基本上可以将大多数PC指针弹飞的现象检测到。到了程序错误处理段,要杀要剐(冷启动还是热启动)就由您了。
仅以一条代码来揭示程序飞跑的本质!750102H;MOV 01H,#02H ,如当前PC不是指向75H,而是指向01H或02H,那么51内的指令译码器将把她们忠实地翻译成AJMP X01H 或 LJMP XXXXH,而XX01H XXXXH又是什么呢?天知道!这样恶性飞跑下去那还不死定!改革一下:
CLR A ;0C4H
INC A ;04H
MOV R1,A ;0F9H
INC A ;04H
MOV @R1,A;86H
每一字节代码都不能在生成跳转和循环,且都是单字节指令!往那跑去?跑出去了都要自己回来!“在家”千日好!“跳出”事事难嘛!这样只要平时习惯了用累加器和寄存器把数倒一倒,把那些危险代码都给倒掉,这样虽说给PC的“足”上多加了两字节的“包”可它不好“跑”啊!“足包”====跑!有朋友会问:要是PC抓做02H--LJMP 又有抓做了老鼻子远的XXH,再抓做隔壁的YYH不就没用了吗?提这样的问题只有ZENYIN这种钻牛角得才会提!PC那一位最活跃啊?PC0啊!要“扯拐”显然发生在她身上,至于那PC15同志啊,睡得更死猪一样,雷爆(强干扰)来了都打不醒?此外如果干扰都强到了PC高位都出错的地步!关电!关电!不干了!“不是我们不行而是敌人太强大”!反过来要是敌人在你的**下,只是偶尔出来捣捣乱,但一出来就冲到屁西(PC)高层,就要问问是不是你的王国根基(硬件)有问题了?而非出在意识形态(软件)上!硬件为本!软件为标!标本兼治铸就坚强体魄,方能百毒不侵!
不要轻信软件狗
关于软件狗的讨论,论坛上多矣。匠人也曾经查阅过许多关于软件狗的文章。有些大师确实提出了一些比较有技巧性的方法。但是,匠人的忠告是:不要轻信软件狗!其实,软件狗相当于软件的一种自律行为。一般的思路都是通过设立一个计数器,在计时中断中对其+1,在主程序的适当地方对其清零。如果程序失控了,清零指令未被执行,但中断造常发生,则计数器溢出(狗狗叫了)。但是这里有个问题:万一干扰导致中断被屏蔽了,那软件狗就***不会叫了!——针对这种可能,有人提出在主程序中反复刷新中断使能标志,保证不让中断被屏蔽。——但万一程序飞到某个死循环中去了,不再执行“刷新中断使能标志”这一功能了,还是有可能把狗狗活活饿死。

AdaMaYun 发表于 2025-7-31 17:15 | 显示全部楼层
CPU受到外界干扰,有时PC指针会飞到另一段程序中会导致死机的
ingramward 发表于 2025-8-4 11:32 | 显示全部楼层
择的陷阱指令必须是CPU能够识别并触发异常的指令,且不会在正常程序中使用。
elsaflower 发表于 2025-8-4 12:20 | 显示全部楼层
覆盖所有未使用的内存区域              
ulystronglll 发表于 2025-8-4 13:22 | 显示全部楼层
硬件协同防护              
i1mcu 发表于 2025-8-4 18:26 | 显示全部楼层
无论是软件陷阱捕获的非法跳转,还是程序口令检测的路径异常,最终都需进入fault_handler处理,核心目标是记录错误信息并恢复系统。
wwppd 发表于 2025-8-4 19:57 | 显示全部楼层
无需额外硬件支持,纯软件即可实现快速捕获。
maqianqu 发表于 2025-8-4 21:50 | 显示全部楼层
程序口令适用于检测逻辑错误或任务调度失败。
xiaoyaodz 发表于 2025-8-5 08:05 | 显示全部楼层
在电源输入端增加LC滤波电路,抑制高频噪声。
minzisc 发表于 2025-8-5 09:51 | 显示全部楼层
软件陷阱可以捕获PC指针跳到空白段的情况,而程序口令可以检测PC指针跳到其他模块的情况。
juliestephen 发表于 2025-8-5 12:05 | 显示全部楼层
当PC因干扰跳出正常代码段时,立即被引导至错误处理函数。
pmp 发表于 2025-8-5 13:50 | 显示全部楼层
软件陷阱是一种特殊的指令序列,当CPU执行到该序列时,会触发一个中断或异常。在嵌入式系统中,通常使用非法指令或特定的指令序列作为陷阱。
pl202 发表于 2025-8-7 09:19 | 显示全部楼层
程序口令是一种在模块化程序设计中使用的机制,通过在每个子程序返回前设置一个唯一的ID号,并在返回后检查这个ID号,确保PC指针没有跳错。
primojones 发表于 2025-8-7 11:36 | 显示全部楼层
程序口令解决 “PC 在合法地址但路径错误” 的问题,通过动态校验实现 “不乱跑”。
uytyu 发表于 2025-8-8 12:50 | 显示全部楼层
软件陷阱解决 “PC 跳向非法地址” 的问题,通过主动捕获实现 “不跑飞”
i1mcu 发表于 2025-8-8 15:31 | 显示全部楼层
电磁干扰导致PC跳变 → 触发MPU异常 → 陷阱程序校验口令 → 恢复控制逻辑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

4250

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

64

主题

4250

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部