prefetch_handler :: prefetch Abort 가 난상황!
R14 : 0x2 >> ?? 모름
>
R13 확인 ( SP) 인데 이전 mode 의 R13을 확인해야함
> Abort mode의 stack 을 가르키고있음 ( 현재 error는 prefetch Abort인데)
이전 mode의 상태는 SPSR에 저장되어있음
: 40000033 == 0011 0000 0000 0000 0000 0000 0011 0011
> 10011 (하위 0~4bit ) : SVC mode
> 1 (하위 5 bit ) : Thumb 모드
>
SVC 의 R13 확인 : 0x0116FD24
FFFFFFFF 만있다..
+
SVC R14도 FFFFFFFF....
>>>
이럴때는 stack 을 뒤져봐야함
FDStack 이므로 쌓은 순으로 보면 가장 최근에 남겨놓은 정보는
: 0x00EDD0FD -1
chaos() 함수에 진입 > 돌아올 주소 R14를 남겨놓았던 흔적
> chaos 진입하는 과정에서 문제생긴걸로 보임
> chaos 를 들여다 보자
chaos()
{
word LocalBuffer[10];
memset ((void *)(LocalBuffer - 10) , 0xFF, 40);
return;
}
> Local 변수를 하나 만들고 0번 인덱스에서 -10 번 인덴스부터 0xFF 를 40byte 만큼 채움
code 의 Assembly는?
chaos 함수 진입 > 돌아갈 주소(LR) 에 R14를 넣음
sub sp, #0x14 : 20바이트 arry를 위해 자리를 만들어둠 ( 0x14 == 20 )
// thumb mode : 원래 word (4byte) 에서 나누기 2
다한뒤 : add sp,#0x14
>
PC(R14) 로 복귀
blx 0xF02348 :
> LR에 0xEDCE65 를 ( 0xEDCE64 +1 ) 을 넣고 branch
(a) chaos() 처리후 돌아갈 LR : 0x00EDD0FD
memset 진입 > SP : LocalBuffer 를 stack에 마련 > (C)를 가르킴
>
(e) 에 memset을 한뒤 돌아갈 주소 :0xEDCE64를 넣은뒤 branch
(b) : 0x14 (20byte) (LocalBuffer) 를 위해 stack 이 자리잡음
> 0x116FD34 : LocalBuffer[9]
// 스택이 높은주소에서 낮은주소로 내려감
// > 높은 인덱스에서 낮은 인덱스로 값을 저장함 > 이건 규칙임
// >>> 배열인덱스가 증가할수록 주소가 증가하는 원리임!
(c) : LocalBuffer[0]
(d) : LocalBuffer[0-10]
// Thumb 모드라서 16bit (2byte) 씩차지함 > 주소가 -2씩 줄어들음
// 0~9 까지는 : 2*10 = 20
// 0~ (-9) : 2*10 =20
그 뒤 채우고자하는 0xFF 값을 채움
pop PC : chaos() 함수로 돌아오고자함
>
(e) 에 있는 0xFFFFFFFF 를 PC로 집어넣고 SP 를 하나 늘렸더니..
// SP는 (c)를 가르키고 있게됨
> 0xFFFFFFFF로 branch 를 못하고 prefetch Abort 발생 !
>> Array를 잡아놓고서 더큰 크기를 쓰게되면 문제가 발생함!
void Test()
{
int LocalBuffer[3];
LocalBuffer[0] =0;
LocalBuffer[1] =1;
LocalBuffer[2] =2;
LocalBuffer[3] =3;
return;
}
R14 > LocalBuffer[3] 의 값을 넣음
> return 할때 R14 에있던값이 Local Buffer[3] 으로 바뀌어있어서 예상치 못한 동작을함
>> Array Over Run !
'임베디드 > 임베디드 레시피' 카테고리의 다른 글
0x0 go (0) | 2025.01.19 |
---|---|
Abort is ISR - IRQ mode 에서의 Abort (0) | 2025.01.19 |
Data Abort (0) | 2025.01.18 |
Task Lock > Watch Reset, 메모리덤프 보는법 ( stm32 cubeide) (0) | 2025.01.18 |
Interrupt Lock > Watch dog Reset (0) | 2025.01.17 |