C 如何在没有jtag、断点、模拟器和仿真器的情况下在目标上编写单步代码
假设您有一个指向函数的指针,该函数的源代码不存在,并且“不受信任”,因为它可能读/写到不允许的内存区域 在它执行每个汇编指令之前,您需要验证它是否没有访问不允许的内存区域 操作系统(几乎)是裸机,即定制的RTO(因此没有Linux或QNX) 这适用于不仅在开发期间而且在正常运行时需要启用的功能 理想情况下,它的运行方式如下: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
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