高分请教香斑竹和STM32高手几个问题

[复制链接]
10294|55
 楼主| 程序匠人 发表于 2012-2-24 20:14 | 显示全部楼层
第4个问题:如何把一段代码复制到RAM中去运行,并在运行结束后销毁RAM中的这段代码?
直接用memcpy就可以,运行结束后memset就销毁了。一般会配上一些加密算法。ARM有相对PC寻址的指令,代码重定向的时候要注意。有的编译器会有生成可重定向代码的功能
lxyppc 发表于 2012-2-24 09:27


嗯,这个我也研究一下看看。。。。
拿起书本 发表于 2012-2-24 20:22 | 显示全部楼层
先顶起来。本人正在抄一本书,这本书对电子工程师很有意义,现在网上还没有电子版,我会一章一章的打出来,希望对大家有帮助。
 楼主| 程序匠人 发表于 2012-2-24 20:30 | 显示全部楼层
不好意思,没有仔细注意内容。

这个问题我还无法解释,能打开.map文件看看,你的R_tab[]和CNT_v1()分别在什么位置吗? 如果怀疑是写保护的问题,你可以看看选项字节区的设置。

还有一种可能是:因为你是通过仿真器操作的,会不会是仿真器作了什么限制?这只是猜想而已。你可以独立运行一下看看。

又想到一个可能,你的R_tab[],实际被分配到RAM区,这肯定是可以被更改的,所以还是要看.map文件。香水城 发表于 2012-2-24 13:38



给香斑竹上一张艳照:

仿真程序中改写CONST数组前后截图对比.PNG


从这张图中,可以看到const确实是被定义在了非RAM区,仍旧被改写为全0。
laserpic 发表于 2012-2-24 23:41 | 显示全部楼层
香水城 发表于 2012-2-25 08:53 | 显示全部楼层
对于43楼的现象,匠人试过不用仿真器直接运行吗?
txcy 发表于 2012-2-25 11:01 | 显示全部楼层
匠人的问题难度不小啊
无冕之王 发表于 2012-2-25 11:10 | 显示全部楼层
匠人的这分比较难拿啊:lol
lxyppc 发表于 2012-2-25 14:51 | 显示全部楼层
对于43楼的现象,匠人试过不用仿真器直接运行吗?
香水城 发表于 2012-2-25 08:53

你仿真或不仿真,现象就在那里,不离不弃
你写零或不写零,结果产生差距,不明所以
lxyppc 发表于 2012-2-25 14:54 | 显示全部楼层
匠人之前说常量数组可以而函数地址不行,那是因为函数地为奇数,转成偶数也会遇到这个问题
 楼主| 程序匠人 发表于 2012-2-25 15:05 | 显示全部楼层
匠人之前说常量数组可以而函数地址不行,那是因为函数地为奇数,转成偶数也会遇到这个问题
lxyppc 发表于 2012-2-25 14:54


奇数?偶数?

这个说法有来头吗?
 楼主| 程序匠人 发表于 2012-2-25 15:06 | 显示全部楼层
对于43楼的现象,匠人试过不用仿真器直接运行吗?
香水城 发表于 2012-2-25 08:53


不用仿真器测试起来比较麻烦,回头找机会专门写段代码验证再说。
yybj 发表于 2012-2-25 18:43 | 显示全部楼层
高手太多,只能慢慢消化
tuzihog 发表于 2012-2-25 23:03 | 显示全部楼层
 楼主| 程序匠人 发表于 2012-2-26 17:37 | 显示全部楼层
顶一下,准备散分
哲哲55 发表于 2012-2-26 20:38 | 显示全部楼层
高手太多,只能慢慢消化
yybj 发表于 2012-2-25 18:43

嚴重同意
yifanfeng 发表于 2012-3-1 22:00 | 显示全部楼层
采用_ramfunc 方式,虽然function会被拷贝到ram,但Flash中仍存在其备份,无法加密。
窃以为以下方法或许可行, 已 function_2_encrypt() 为例:
1. 将其声明如下 void function_2_encrypt __attribute__((section("encrypt_sec")))
2. 在link script 中定义encrypt section 并定义其开始和结束符号用以标记其范围,并规定该section加载到flash中,运行在ram中, 在MDK中很容易写脚本, IAR请参考其手册。
3. 写一个PC端的小程序解析生成的*.out目标文件中的encrypt section, 并加密之,加密后补0以确保文件大小不变。
4。 在Main 函数的开始出写解密代码直接对在RAM中的已加密函数进行解密后运行即可。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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