Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在没有jtag、断点、模拟器和仿真器的情况下在目标上编写单步代码_C_Assembly_Arm_Gdb_Embedded - Fatal编程技术网

C 如何在没有jtag、断点、模拟器和仿真器的情况下在目标上编写单步代码

C 如何在没有jtag、断点、模拟器和仿真器的情况下在目标上编写单步代码,c,assembly,arm,gdb,embedded,C,Assembly,Arm,Gdb,Embedded,假设您有一个指向函数的指针,该函数的源代码不存在,并且“不受信任”,因为它可能读/写到不允许的内存区域 在它执行每个汇编指令之前,您需要验证它是否没有访问不允许的内存区域 操作系统(几乎)是裸机,即定制的RTO(因此没有Linux或QNX) 这适用于不仅在开发期间而且在正常运行时需要启用的功能 理想情况下,它的运行方式如下: void (*fptr)(int); fptr = &someFunction; // untrusted, don't have source // enable

假设您有一个指向函数的指针,该函数的源代码不存在,并且“不受信任”,因为它可能读/写到不允许的内存区域

在它执行每个汇编指令之前,您需要验证它是否没有访问不允许的内存区域

操作系统(几乎)是裸机,即定制的RTO(因此没有Linux或QNX)

这适用于不仅在开发期间而且在正常运行时需要启用的功能

理想情况下,它的运行方式如下:

void (*fptr)(int);
fptr = &someFunction; // untrusted, don't have source
// enable interrupts for each assembly instruction
_EN_INT();
// call the function
fptr();
// everytime the PC increments, some other code runs which verifies that if any load/stores are executed, it doesn't access some disallowed memory range

// disable interrupts for each assembly instruction
_DIS_INT();
问题

是否可以在每个汇编指令之后调用该函数并暂停执行

是的,ARM模拟器/解释器听起来和我想要的一模一样。有免费的吗

qemu是开源的,大部分是GPLv2。您可能需要对其进行大量修改,因为它是为整个Unix进程(qemu用户)或整个机器(qemu系统)设计的独立包装器


我在谷歌上搜索过,还有一个设计用来作为更大程序的一部分(用C编写,带有用于从各种语言调用的绑定)。它也是GPLv2(不是LGPL),所以如果您的其余代码也是自由软件,您可以使用它

它实际上基于QEMU的CPU仿真代码;他们剥离了所有的设备/BIOS仿真内容,制作了一个只用于模拟CPU的灵活库

大概你可以为它配置一些内存保护,设置启动机器的状态,让它运行你的功能(返回地址导致一些代码,将控制权交还给你的主代码?)

是的,ARM模拟器/解释器听起来和我想要的一模一样。有免费的吗

qemu是开源的,大部分是GPLv2。您可能需要对其进行大量修改,因为它是为整个Unix进程(qemu用户)或整个机器(qemu系统)设计的独立包装器


我在谷歌上搜索过,还有一个设计用来作为更大程序的一部分(用C编写,带有用于从各种语言调用的绑定)。它也是GPLv2(不是LGPL),所以如果您的其余代码也是自由软件,您可以使用它

它实际上基于QEMU的CPU仿真代码;他们剥离了所有的设备/BIOS仿真内容,制作了一个只用于模拟CPU的灵活库

大概你可以为它配置一些内存保护,设置启动机器的状态,让它运行你的功能(返回地址导致一些代码,将控制权交还给你的主代码?)

操作系统(几乎)是裸机,即定制的RTO(因此没有Linux或QNX)

我的回答是假设你可以按照你需要的方式修改“操作系统”

皮质MK20DX256VLH7

这似乎是Cortex M4 CPU

如何在没有jtag和断点的情况下在目标上编写单步代码

文档中没有说明是否需要外部调试器来恢复执行

如果CPU真的停止了,您肯定需要一个外部信号(例如来自调试器)

然而,大多数CPU支持软件调试。这意味着每当遇到断点时,就会执行中断服务例程。要继续执行,只需从中断服务例程返回

我不知道Cortex M4,但对于Cortex M3,您必须设置一些特殊寄存器以启用该功能。每当命中“BKPT”指令时,就会执行中断#12(*)

对于RAM中的代码,只需将BKPT指令(0xBExx,例如0xBEBE)写入要设置断点的地址。(在写入之前,请先读取该值,以便以后能够恢复该值)

对于闪存中的代码,M3有一个“闪存修补单元”,允许您指定最多三个地址,即使存储了其他数据,也应将其读取为0xBExx(0xBEBE?)。这允许您在Flash中设置最多3个断点

有趣的是:控制M3中调试功能的寄存器(名为“DEMCR”)也有一个名为“MON_STEP”的位:

如果在中断处理程序#12中设置此位,则从中断处理程序返回后,将执行一条指令,并再次触发中断#12。当然,这个特性的用例是单步代码

要停止单步,您必须再次清除单步位

重要1:

我不知道MK20DX256VLH7是否真的具备所有这些功能。然而,因为它是Cortex M4芯片,M4应该具有M3的几乎所有功能,这些功能应该存在

重要事项2:

实现单步执行和调试不是很快完成的。汇编语言知识将是非常有帮助的,你将需要很多时间

从医生那里

您不仅需要NXP提供的MK20DX256VLH7文档,还需要ARM提供的Cortex M4文档

(*)矢量表中的偏移量4*12在此表示(在一些ARM文档中称为“IRQ(-4)”;不是IRQ12

操作系统(几乎)是裸机,即定制的RTO(因此没有Linux或QNX)

我的回答是假设你可以按照你需要的方式修改“操作系统”

皮质MK20DX256VLH7

这似乎是Cortex M4 CPU

如何在没有jtag和断点的情况下在目标上编写单步代码

文档中没有说明是否需要外部调试器来恢复执行

如果CPU真的停止了,您肯定需要一个外部信号(例如来自调试器)

然而,大多数CPU支持软件调试。这意味着每当遇到断点时,就会执行中断服务例程。要继续执行,只需从中断服务例程返回

我不知道皮质M4,但是皮质M3