裸奔程序为什么会跑飞?

  经常在论坛里面,看到一些人说“程序跑飞了!”。以前我真不太理解这个词语,刚才看了个帖子,觉得有点收获,就写下来,造福you and me。

  所谓“程序跑飞了”,就是程序找不到正确的地址去寻找应该执行的指令,这通常是在中断跳转,MMU设置相关。下面这个帖子就是这个原因。

http://topic.csdn.net/u/20090517/14/4664821b-b0b5-4142-bbf7-5a38e630e18a.html?seed=1566368328

 

引用 13 楼 xajhuang 的回复:
这个肯定不是,ARM中断产生后,会自动跳转到对应的中断地址,比如复位时跳到0,ISR 跳到 ISR 异常入口,当中断产生时,代码不是直接跳到中断程序中,而是进行了一次类似复位的操作,然后根据对应的中断异常再执行处理。
所以一般仿真器是不会自动找到中断程序的,一般的做法是在启动代码初始化完成,并且使能中断前,用MMU把你代码的ResetHandle地址映射到0地址,这样仿真器就能找到中断函数入口而不会跑飞。
还有一种可能就…



xajhuang 牛人说的很对!!!一般调试器不支持中断跳转的,可以通过MMU处理后支持调试器。

 

引用 18 楼 CBEMA 的回复:
搞定了,呵呵。每次弄明白了以后,都觉得自己很弱。

的确是mmu的问题。我把程序应映射到0x30000000的位置执行的话,必须在mmu中做一些处理,使得程序在取指的时候,能到0x30000000的位置开始。实际上,我以前改来改去程序经常跳到0x8或是0x4的位置,我就应该意识到内存映射出了问题。

现在我把程序放在0x0的位置开始跑,就ok了。这里不用启动mmu管理。

不过对于mmu的了解还是太少了,还得练啊。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值