TI中文支持网
TI专业的中文技术问题搜集分享网站

在程序执行过程中动态修改内存中指定(函数)地址的指令,然后执行修改后的新指令的问题

开发板(CPU):DSP 6713

开发环境:CCS 3.3

配置:代码段分在L2SRAM,memory map里面是可读可写的。

问题描述:

预期的正确结果是:在程序执行过程中动态修改内存中指定(函数)地址的指令,然后执行修改后的新指令。

实验过程:向指定函数地址写入新的指令后,用内存窗口或汇编窗口查看,观察到的都是修改后的新指令。但是当实际执行到这段新指令时,却依然执行的是原先(修改前)的指令。采用软件仿真、硬件仿真都得到相同的错误结果。

而且,在mix mode里看到的汇编指令是修改后的新指令,但是执行起来却还是修改前的旧指令。

补充说明:在2812系列的DSP开发板上进行上述实验,结果正确。

实验用的示例程序:

#include <stdio.h>

#include <csl.h>

void main() {

int flags = 0;

unsigned int* ptr;

int result;

if(flags) {

TEMP1:

//程序执行到此处时是将result的值加1,此时可在mix mode下单步过,并观察相应寄存器的值,

//会发现没有任何寄存器的值改变,程序执行的还是原先的NOP指令。

asm(" NOP ");

asm(" NOP ");

asm(" NOP ");

asm(" NOP ");

asm(" NOP ");

asm(" NOP ");

goto TEMP2;

}

result = 0;

//定位上面那几条NOP指令的位置

ptr = (unsigned int*)main;

while(*ptr!=0)

ptr++;

//以下几行代码是直接修改内存中TEMP1处的代码(原先是NOP指令)

//修改后的指令的作用是将result的值加1

ptr[0] = 0x023c62e6;

ptr[1] = 0x00006000;

ptr[2] = 0x0210205A;

ptr[3] = 0x023C62F6;

ptr[4] = 0x00002000;

//在此处可下断点,程序执行到此处可以去查看内存窗口,会发现TEMP1处的二进制代码已经改变

goto TEMP1;

TEMP2:

//然而执行到此处result并没有加1,即被修改后的代码并没有执行。

if(result) {

printf("the code has been modified~");

}

else {

printf("error~");

}

return ;

}

Yu Liu:

您好!

不是很熟悉67系列的DSP,不过CCS的软件断点就是利用类似的机制完成的。建议查一下有cache导致的不一致。也看看论坛上其他大侠是否有更好的建议。

Tony Tang:

回复 Yu Liu:

建议通过CCS的memory view里看一下Cache的内容是否与物理内存的内容一致。如果不一致,在执行前做一下Cache invalidate操作。

赞(0)
未经允许不得转载:TI中文支持网 » 在程序执行过程中动态修改内存中指定(函数)地址的指令,然后执行修改后的新指令的问题
分享到: 更多 (0)