使用 IDA 将 jtag-openocd-gdb 连接到 arm11 设备无法控制

逆向工程 艾达 硬件 数据库 手臂 标签
2021-07-01 06:03:51

我从一个硬件中获得了一个二进制块,我已经用 IDA 破译了几天了。今天我终于通过 JTAG 连接了一个探针,并让 openocd 启动了一个 GDB 服务器。IDA 正在连接到 GDB 服务,但是当我附加到处理时,它显示内存中的所有零,而 PC 不在我期望的位置。基本上似乎 IDA 没有控制权,也没有与之挂钩。顺便说一句,目标正在运行,如果不需要,我宁愿不进行暂停重置。我相信 JTAG 可以做到这一点。

每个人都没有流程,但我真的希望能够在代码的某些地方设置断点和单步执行。显然存在一些设置问题。有任何想法吗?

更新:

我有很多东西要学,结果发现很多事情都错了。

  1. 从通过终端使用 OPENOCD 开始
  2. 您确实需要停止目标才能访问 arm 中的寄存器
  3. 似乎我的 JTAG 速度太高了
  4. 被测设备打开了 WDT。现在关闭它,我可以停止目标并查看正确的寄存器。我可以看到这种情况正在发生,因为它可以很好地开始读取 PC,但是当它降低 regs 时,它会读取所有 F
  5. DUT 具有缓存和 MMU,因此虽然我可以暂停目标,但重新启动总是以数据中止告终。在 ocd 中查看 arm11.c 似乎有一堆存根没有完全实现以打开缓存。我已经尝试在恢复之前刷新缓存,但仍然出现数据中止。需要更多调查,但如果有人有建议,请告诉我。

到目前为止,感谢您的帮助,这肯定是一次学习经历。

2个回答

事实证明,ARM11 的 openocd 有一些错误。我最终进行了一些更改以使其按照 arm 规范工作:

arm11_debug_entry

  • 打开数据的排放会中止。支票应该是:

    if (!(dscr & DSCR_STICKY_ABORT_IMPRECISE))
    
  • 然后在C1控制寄存器前添加如下代码

    /* Enable Debug Cache write back, and disable line fills */
    /* mcr p15,7,R0,c15,c0,0 */
    retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xeeef0f10, 0x07);
    if (retval != ERROR_OK)
        return retval;
    
  • 现在我保存然后恢复 C1 控制寄存器

    /* Read Modify write control register 1 to disable MMU/Cache etc. Store to reprogram upon return */
    /* MRC p15,0,R0,c1,c0,0 */
    arm11_run_instr_data_from_core_via_r0(arm11, 0xee110f10, &cntrlregval);
    if (retval != ERROR_OK)
        return retval;
    
    arm11->saved_c1cntrl = cntrlregval;
    
    /* Perform Modifications */
    
    /* MCR p15,0,R0,c1,c0,0 */
    retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xee010f10, cntrlregval);
    if (retval != ERROR_OK)
        return retval;
    

arm11_leave_debug_state

    /* disable debug cache write thrus, etc */
retval = arm11_run_instr_data_prepare(arm11);
    if (retval != ERROR_OK)
        return retval;

 retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xeeef0f10, 0x00);
    if (retval != ERROR_OK)
        return retval;

 /* re write Coprocessor control */
 retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xee010f10, arm11->saved_c1cntrl);
    if (retval != ERROR_OK)
        return retval;

 retval = arm11_run_instr_data_finish(arm11);
    if (retval != ERROR_OK)
        return retval;

我会尝试进行这些更改,以便其他人不会遇到我的问题。

鉴于您想要单步执行,您迟早会停止处理器,是什么阻止您现在尝试它?

我试图想象如果正在运行的程序保持总线在使用中,JTAG 单元将如何检查内存?我希望 TAP 可以在处理器运行时访问一些边界单元,因为它们基本上是复制/镜像值,但我不知道其他内存。

我建议停止目标并重试。对我来说,IDA 只能在它具有控制权时查询并正确显示 CPU 寄存器和内存的状态,这是最有意义的。