原创 圈圈同学:万里长征走出了第一步....

2006-12-30 02:22 4593 6 6 分类: MCU/ 嵌入式
computer00 发表于 2006-2-27 12:58 ZLG-ARM ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

的确是很忽悠…………


回复:"死锁"不能只看表面现象(含非典"改造论")

computer00发表评论于2006-2-26 20:02:00


今天看了看LPC2138的中断方式,大概明白你的意思了。在2138中,中断向量地址是保存在寄存器中的…………

而在中断向量地址寄存器里面,你不保存实际的地址,而是保存一个地址编号,然后通过这个编号,到ROM里面去

检索一个地址(检索这个地址时可以判断检索号是否有效),然后再根据这个地址去跳转…………这样

即使发生错误,也不会跳到“平民区”…………


hotpower 发表于 2006-2-27 22:29 ZLG-ARM ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

圈圈同学:万里长征走出了第一步....


地址改编号像是开"遵义会议",在保证了跳入的地址"正确"后,才能够实施对"正确"结果的捕捉行为.
否则,跳飞的程序乱改数据就像一匹不能驯服的野马,没人知道它所产生的后果.

但是即使保证了跳入的地址"正确"后也不能解决死锁的问题.(这次讨论暂不涉及看门狗的问题)

在软件包more.asp?name=hotpower&id=9554中实际已给出了一个简单的防御程序.

在LPCARM自身的防御系统中,实际已包含了许多的软件保护措施.

如保护使能寄存器VIC->Protection=1时,在用户模式是不能对VIC结构的任何成员进行改写的.
这也包括VIC->VectAddrs及VIC->VectAddr等危险人物.

也就是说在理论上,当系统工作在用户模式下,VIC是"安全"的.

但是,当任何方式的中断到来后,情况就不一样了.

首先,不管VIC->Protection为何值,VIC结构是可以改写的(VIC->VectAddr用于清除中断内部标志).

此时,全部的危险人物都会出来捣蛋.

头号的危险人物(暂称黑桃A)当属中断使能寄存器VIC->IntEnable.

如果某向量中断已开放,干扰也可能将其关闭,反之,会将其开放.

用户一般不会对未使能的向量中断编写ISR,要写肯定被人说是吃饱了没事干了!!!

但是,你会在菜农改编的STARTUP.S中看到未用的都被直接链接到复位向量强行复位.

当然以上都是在向量控制寄存器VIC->VectCntls该向量中断也同时被势能的情况下发生的,这种概率几乎不能发生.

最可能发生的将是有用户默认中断程序时,未使能的向量中断都将被导入DEF_Handler()内运行.(这时IRQStatus的对应位被置1)

所以,在DEF_Handler()拦截将是最重要的措施...

晕菜~~~回复写多了肯定晕到,就先到这里吧...

看完后再继续探讨吧...
http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?id=1994063
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条