2013-04-18 2 views
1

워치 독의 원인을 이해하려고 시도합니다. 덤프에서두 명령어 사이의 PC 값 (프로그램 카운터)

fe813cf0:  2820   cmp  r0, #32 
fe813cf2:  dbf0   blt.n fe813cd6 <XYZ+0x10> 
fe813cf4:  f04f 30ff  mov.w r0, #4294967295 ; 0xffffffff 
fe813cf8:  bd10   pop  {r4, pc} 

내 PC 값이 fe813cf3입니다 다음과 같이 조립 일상의 조각입니다. 이것은 무엇을 의미 하는가? 어떻게 해석해야합니까? 자세한 정보가 필요한 경우 알려주십시오.

+0

프로세서 '모드'도 알고 있습니까? –

+0

CPSR 레지스터의 값은 무엇입니까? –

+0

@artlessnoise 프로세서가 FIQ 모드에 있습니다. 내가 보여주는 오전 루틴은 FIQ 핸들러에서 호출됩니다. –

답변

2

트리거가 발생하는 워치 독인 경우 프로세서가 중단되었음을 나타냅니다. 최악의 경우에 캡처중인 상태가 손상되었을 수 있습니다. 어떻게 "덤프 (dump)"를 얻을 수 있는지 확실하지 않으므로 말하기 어렵습니다.

일반적으로 ARM에서는 홀수 주소가 Thumb 명령어 세트로 전환하려는 점프를 나타냅니다.

예를 this documentation of the BX (branch exchange) instruction를 참조하십시오 :

BX 명령어 가지를 지정된 레지스터에 포함 된 주소로. 분기 주소의 비트 0 값은 ARM 상태 또는 Thumb 상태에서 실행이 계속되는지 여부를 결정합니다.

  • 모든 ARM 명령어는 워드로 정렬됩니다 때문에 주소의

    비트 0이 방법으로 사용할 수 있습니다. 즉, ARM 명령어의 주소 중 비트 0과 1은 해당 비트가 주소의 하프 워드 및 바이트 부분을 참조하기 때문에 무시됩니다.

  • 모든 Thumb 명령어는 하프 워드로 정렬됩니다. 즉, Thumb 명령어의 비트 0은 주소의 바이트 부분을 참조하기 때문에 무시됩니다.

그러나, 나는 분기 명령에 의해 삭제됩니다 위는 PC가 가 홀수 주소로를 설정 실제로 결코 것을 의미 확신 0 비트입니다.

+0

+1. 귀중한 정보에 감사드립니다. –

+0

덤프가 손상되지 않았 음을 확인하십시오. 다른 사용 사례의 경우 일반적인 충돌과 마찬가지로 주소가 PC의 홀수임을 확인합니다. 나는 알아 내려고 노력하고있다. 그러나 당신이 준 정보는 유용했다. 감사합니다 –

+1

덤프의 PC에서 홀수를 보는 이유는 예외 처리기가 예외가 트리거 될 때 PC가 숨겨진 LR 레지스터에서 PC 값을 가져오고 CPU 벡터가 처리기에 도달하기 때문입니다. 예외가 발생했을 때 CPU가 엄지 모드에 있으면 LR에 비트 0이 설정됩니다. 파이프 라인 효과로 인해 LR에 저장되는 PC는 오류 발생 명령어 다음에 몇 가지 명령어가됩니다 (따라서 나는 오류를 일으킨 명령어가 0xfe813cee 주소에있을 것이라고 생각합니다. 잘못된 주소). –