gpt4 book ai didi

c - 如何在没有 jtag、断点、模拟器、仿真器的情况下在目标上单步执行代码

转载 作者:太空宇宙 更新时间:2023-11-04 05:34:07 25 4
gpt4 key购买 nike

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

在它执行每条汇编指令之前,您要验证它不会访问不允许的内存区域。

操作系统(几乎)是裸机,即自定义 RTOS(因此没有 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();

问题

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

最佳答案

The OS is (almost) bare-metal i.e. a custom RTOS (so no Linux or QNX).

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

Cortex MK20DX256VLH7

这似乎是一个 Cortex M4 CPU。

how to single-step code on-target with no jtag, breakpoints

From the doc, it doesn't say whether you NEED an external debugger to resume execution.

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

不过大多数 CPU 都支持软件调试。这意味着只要遇到断点,就会执行中断服务例程。要继续执行,您只需从中断服务例程中返回即可。

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

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

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

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

如果您在中断处理程序#12 中设置该位,则在从中断处理程序返回后恰好执行一条指令并再次触发中断#12。此功能的用例当然是单步执行代码!

要停止单步执行,您必须再次清除 MON_STEP 位...

重要 1:

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

重要2:

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

From the doc, ...

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

(*) vector 表中的偏移量4*12就是这里的意思(在某些ARM文档中被命名为“IRQ(-4)”);不是 IRQ12。

关于c - 如何在没有 jtag、断点、模拟器、仿真器的情况下在目标上单步执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47207384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com