gpt4 book ai didi

gdb - 软件中断异常还是未定义指令异常?

转载 作者:行者123 更新时间:2023-12-02 16:30:13 25 4
gpt4 key购买 nike

我正在带有 JTAG 连接器和 gdb 的裸机 ARM(兼容 v5TE)上运行程序。该程序在管理模式下从某些 SDRAM 运行,并且仅使用 ARM 指令。

在某些时候会发生异常。使用 ctrl+C 停止 gdb 我可以看到 CPSR 指示未定义的异常模式,但程序计数器指示软件中断异常 (0xffff0008)。根据ARM ARM的规定,当发生未定义指令异常时,PC_und应该为0xffff00040x00000004。我的程序发生了什么,是否发生了 SWI 或者未定义的指令异常?

编辑以使我的问题更清楚:

我的程序目的是测试定制板的硬件。当出现硬件问题时,RAM 中的程序可能会损坏(如下所示),这就是生成异常的原因。当硬件正常时,测试软件运行没有问题。我的RAM地址范围从0到0x40000000,程序加载在0x1000到0x2000之间。管理程序模式堆栈指针设置为 0xff0。中断向量仅由断点组成。

(gdb) c
Continuing.
^C^C
Program received signal SIGTRAP, Trace/breakpoint trap.
0xffff0008 in ?? ()

来自未定义异常模式的寄存器:

(gdb) i r 
r0 0x52878 338040
r1 0x2020000 33685504
r2 0x2020000 33685504
r3 0x2020000 33685504
r4 0x2020000 33685504
r5 0x2020000 33685504
r6 0x2020000 33685504
r7 0x2020000 33685504
r8 0x2020000 33685504
r9 0x2020000 33685504
r10 0x2020000 33685504
r11 0x2020000 33685504
r12 0x2020000 33685504
sp 0x2020000 0x2020000
lr 0xffff0008 4294901768
pc 0xffff0008 0xffff0008
fps 0x0 0
cpsr 0x800000db 2147483867

从管理模式注册:

(gdb) set $cpsr=0xd3
(gdb) i r
r0 0x52878 338040
r1 0x2020000 33685504
r2 0x2020000 33685504
r3 0x2020000 33685504
r4 0x2020000 33685504
r5 0x2020000 33685504
r6 0x2020000 33685504
r7 0x2020000 33685504
r8 0x2020000 33685504
r9 0x2020000 33685504
r10 0x2020000 33685504
r11 0x2020000 33685504
r12 0x2020000 33685504
sp 0xff3ffffe 0xff3ffffe
lr 0x1020 4128
pc 0xffff0008 0xffff0008
fps 0x0 0
cpsr 0xd3 211

这里是 RAM 中由主管链接寄存器指向的地址周围的(损坏的)程序:

(gdb) x/5i 0x1020-8
0x1018 <_start+24>: bic r0, r0, #135168 ; 0x21000
0x101c <_start+28>: strbcs r0, [r0], #1025
0x1020 <_start+32>: mcr 15, 0, r0, cr1, cr0, {0}
0x1024 <_start+36>: ldr r1, [pc, #120] ; 0x10a4 <skip_intreg_reset+100>
0x1028 <_start+40>: ldr r2, [r1, #8]

(gdb) x/4w 0x1018
0x1018 <_start+24>: 0xe3c00a01
0x101C <_start+28>: 0xfec00401
0x1020 <_start+32>: 0xee010f10
0x1024 <_start+36>: 0xe59f1078

从程序目标文件转储:

  18:   e3c00a01    bic r0, r0, #4096   ; 0x1000
1c: e3c00001 bic r0, r0, #1 ; 0x1
20: ee010f10 mcr 15, 0, r0, cr1, cr0, {0}
24: e59f1078 ldr r1, [pc, #120] ; a4 <skip_intreg_reset+0x64>
28: e5912000 ldr r2, [r1]

最佳答案

这是一个社区维基答案。

该问题是由两个不同的问题引起的:

  • 正在初始化错误的向量表。 ARM 具有可选择的高位和低位向量,默认值是高位 0xffff0000,而代码的初始化就像向量表位于 0x00000000 处一样。高向量表包含以下指令(异常时无限循环):
0xffff0000: b 0xffff0020 
0xffff0004: b 0xffff0004
0xffff0008: b 0xffff0008
0xffff000c: b 0xffff000c
0xffff0010: b 0xffff0010
0xffff0014: b 0xffff0014
0xffff0018: b 0xffff0018
0xffff001c: b 0xffff001c
  • 板上的 SDRAM 问题导致 RAM 中的程序内容损坏并生成未定义的异常。之后程序停止响应,因为它处于无限循环中并且 OP 停止了 gdb。当使用ctrl+C停止gdb时,使用的JTAG调试器(peedi)实际上跳转到下一条指令,这就是为什么pc甚至是0xffff0008尽管 cpsr 指示位于 0xffff0004 的未定义异常。

关于gdb - 软件中断异常还是未定义指令异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15433356/

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