簡體   English   中英

軟件中斷異常還是未定義的指令異常?

[英]Software interrupt exception or undefined instruction exception?

我正在使用JTAG連接器和gdb在裸機ARM(兼容v5TE)上運行程序。 該程序在管理員模式下從某些SDRAM運行,並僅使用arm指令。

在某些時候發生異常。 使用ctrl + CI停止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)實際上會跳轉到下一條指令,這就是為什么pc0xffff0008即使cpsr指示位於0xffff0004的未定義異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM