임베디드/임베디드 레시피

Stack의 Size

twoweeks-within 2024. 12. 7. 23:57

 현재 PC : 0x18122C9E인 경우

 

 

addr/line__|code_____|label____|mnemonic________________|comment
ST:18122C90|4010                and     r0,r2
ST:18122C92|40C8                lsr     r0,r1
ST:18122C94|40CB                lsr     r3,r1
ST:18122C96|1A18                sub     r0,r3,r0
ST:18122C98|2801                cmp     r0,#0x1
ST:18122C9A|D103                bne     0x18122CA4
|           {
1552|             gc_sm (UP_EV);
ST:18122C9C|2002                mov     r0,#0x2
ST:18122C9E|FE6BF7FF____________bl______0x18122978_______;_gc_sm
ST:18122CA2|E002                b       0x18122CAA
|         }
|     else
|     {
1556|             gc_sm (STAY_EV);
ST:18122CA4|2001                mov     r0,#0x1
ST:18122CA6|FE67F7FF            bl      0x18122978       ; gc_sm
|     }
|    #endif /* hieonn #if 0 */
|  }
|
|
|  /* Check the page status it should be marked erased. */

 R0~R15의 값

 

N _  R0          2                   R8          0  SP> 0000030D
Z _  R1          6                   R9          0  -1C 0000030F
C C  R2   FFFFFFC0        R10         0  -18 00002842
V _  R3         14                 R11         0  -14 01D63EE0
I _  R4   01D64160         R12  01803AD0  -10 00000000
F _  R5   01D63EE0       R13  01803AD0  -0C 0000030D
T T  R6   01D64120       R14  18122C5D  -08 00000004
J _  R7   18B5E7D4        PC   18122C9E  -04 1812434D
usr  SPSR                       CPSR 20000030  FP> 00900C0C
Q _                                +04 00000004


이때, Stack Pointer (R13) : 01803AD0


___address__|________0________4________8________C_0123456789ABCDEF
SD:01803A70| 00000000 00000000 00000000 00000000 ................
SD:01803A80| 00000000 00000000 00000000 00000000 ................
SD:01803A90| 00000000 00000000 00000000 00000000 ................
SD:01803AA0| 00000000 00000000 00000000 00000000 ................
SD:01803AB0| 00000000 00000000 00000000 00000000 ................
SD:01803AC0| 00000000 00000000 00000000 00000000 ................
SD:01803AD0|>0000030D 0000030F 00002842 01D63EE0 ........B(...>..
SD:01803AE0| 00000000 0000030D 00000004 1812434D ............MC..
SD:01803AF0| 00900C0C 00000004 03000004 0000030C ................
SD:01803B00| 0000030E 00000000 00000000 00000000 ................
SD:01803B10| 00000004 00000001 30730000 00000000 ..........s0....
SD:01803B20| 00000200 00000036 00000000 00000000 ....6...........
SD:01803B30| 01D6371C 00901FE8 00901F68 0000081C .7......h.......
SD:01803B40| 01D6381C 01D6379C FFFFFFF1 0000030E .8...7..........
SD:01803B50| 01D6379C 01D6371C 00000A73 01DA6B00 .7...7..s....k..
SD:01803B60| 00000000 18014B03 000004C4 01DA6B00 .....K.......k..
SD:01803B70| 00000A73 180136FD 0000030E 01D63EE0 s....6.......>..
SD:01803B80| 00000025 01D76B00 00000004 01D638E4 %....k.......8..

 

 

 

0x1803AD0 :  0x30D

 

 PC값 0x18122C9E 

     > opcode는 bl 0x18122978 

 0x18122978 : void gc_sm(..) 함수의 시작 지점인 push {r14} 지점을 가르킴

 > PC > Jump >  gc_sm()함수가 호출  

   >   돌아 갈 주소 r14 : 0x18122CA2을 의미하는 0x18122CA3 (Thumb mode)


_addr/line__|code_____|label____|mnemonic________________|comment
|
|void gc_sm (curr_gc_event_type curr_event)
1452|{
ST:18122978|B500      gc_sm:    push    {r14}
|      curr_gc_state next_status;
|      curr_gc_state old_status;
|
1456|      old_status = curr_status;  /* save the current status */
ST:1812297A|4B6E________________ldr_____r3,0x18122B34
ST:1812297C|7819                ldrb    r1,[r3]
|
1458|      if (curr_status == INIT_ST)
ST:1812297E|2900                cmp     r1,#0x0
ST:18122980|D101                bne     0x18122986
1459|          curr_status = STAY_ST;
ST:18122982|2101                mov     r1,#0x1
ST:18122984|7019                strb    r1,[r3]
|
1461|      switch (curr_status)
ST:18122986|7819                ldrb    r1,[r3]
ST:18122988|2901                cmp     r1,#0x1
ST:1812298A|D005                beq     0x18122998
ST:1812298C|2902                cmp     r1,#0x2
ST:1812298E|D101                bne     0x18122994

 

 push {r14} > R14 : 0x1822CA3 > gc_sm()함수를 실행하고 나서 돌아가야 할곳

 

  >  push > SP : R13-0x4 > 0x1803ACC

      >  0x1803ACC : R14 값 0x18122CA3

 


N _  R0          2  R8          0  SP> 18122CA3
Z _  R1          6  R9          0  FP> 0000030D
C C  R2   FFFFFFC0  R10         0  +04 0000030F
V _  R3         14  R11         0  +08 00002842
I _  R4   01D64160  R12  01803AD0  +0C 01D63EE0
F _  R5   01D63EE0  R13  01803ACC  +10 00000000
T T  R6   01D64120  R14  18122CA3  +14 0000030D
J _  R7   18B5E7D4  PC   1812297A  +18 00000004
usr  SPSR           CPSR 20000030  +1C 1812434D
Q _                                +20 00900C0C

___address__|________0________4________8________C_0123456789ABCDEF
SD:01803A70| 00000000 00000000 00000000 00000000 ................
SD:01803A80| 00000000 00000000 00000000 00000000 ................
SD:01803A90| 00000000 00000000 00000000 00000000 ................
SD:01803AA0| 00000000 00000000 00000000 00000000 ................
SD:01803AB0| 00000000 00000000 00000000 00000000 ................
SD:01803AC0| 00000000 00000000 00000000>18122CA3 ................

//SD : 01803ACC
SD:01803AD0| 0000030D 0000030F 00002842 01D63EE0 ........B(...>..
SD:01803AE0| 00000000 0000030D 00000004 1812434D ............MC..
SD:01803AF0| 00900C0C 00000004 03000004 0000030C ................
SD:01803B00| 0000030E 00000000 00000000 00000000 ................
SD:01803B10| 00000004 00000001 30730000 00000000 ..........s0....
SD:01803B20| 00000200 00000036 00000000 00000000 ....6...........
SD:01803B30| 01D6371C 00901FE8 00901F68 0000081C .7......h.......
SD:01803B40| 01D6381C 01D6379C FFFFFFF1 0000030E .8...7..........
SD:01803B50| 01D6379C 01D6371C 00000A73 01DA6B00 .7...7..s....k..
SD:01803B60| 00000000 18014B03 000004C4 01DA6B00 .....K.......k..
SD:01803B70| 00000A73 180136FD 0000030E 01D63EE0 s....6.......>..
SD:01803B80| 00000025 01D76B00 00000004 01D638E4 %....k.......8..


 Stack에 돌아 갈 주소 : r14 : 0x18122CA3를 쌓고서, 일을 시작

(FD stack)

gc_sm(..) 종료 > 0x18122CA2 (thumb) 로 돌아옴

    > pop {pc}

  > Stack에 들어 있던, R14 값 > PC에

  >  Stack Pointer를 +0x4

 

 

 

_addr/line__|code_____|label____|mnemonic________________|comment
|           {
1552|             gc_sm (UP_EV);
ST:18122C9C|2002                mov     r0,#0x2
ST:18122C9E|FE6BF7FF            bl      0x18122978       ; gc_sm
ST:18122CA2|E002________________b_______0x18122CAA
|         }
|     else
|     {
1556|             gc_sm (STAY_EV);
ST:18122CA4|2001                mov     r0,#0x1
ST:18122CA6|FE67F7FF            bl      0x18122978       ; gc_sm
|     }
|    #endif /* hieonn #if 0 */
|  }
|
|
|  /* Check the page status it should be marked erased. */
ST:18122CAA|6A68                ldr     r0,[r5,#0x24]
ST:18122CAC|9901                ldr     r1,[r13,#0x4]
ST:18122CAE|6843                ldr     r3,[r0,#0x4]
ST:18122CB0|2200                mov     r2,#0x0
ST:18122CB2|4798                blx     r3

N _  R0          2  R8          0  SP> 0000030D
Z _  R1       010E  R9          0  -1C 0000030F
C _  R2   18B5E7D4  R10         0  -18 00002842
V _  R3   18B5E7D4  R11         0  -14 01D63EE0
I _  R4   01D64160  R12  01803AD0  -10 00000000
F _  R5   01D63EE0  R13  01803AD0  -0C 0000030D
T T  R6   01D64120  R14  18122995  -08 00000004
J _  R7   18B5E7D4  PC   18122CA2  -04 1812434D
usr  SPSR           CPSR       30  FP> 00900C0C
Q _                                +04 00000004

___address__|________0________4________8________C_0123456789ABCDEF
SD:01803A70| 00000000 00000000 00000000 00000000 ................
SD:01803A80| 00000000 00000000 00000000 00000000 ................
SD:01803A90| 00000000 00000000 00000000 00000000 ................
SD:01803AA0| 00000000 00000000 00000000 00000000 ................
SD:01803AB0| 00000000 00000000 00000000 00000000 ................
SD:01803AC0| 00000000 00000000 00000000 18122CA3 ................
SD:01803AD0|>0000030D 0000030F 00002842 01D63EE0 ........B(...>..

// 총 16byte    4byte * 4  

// 그래서 다음 SD (stack dump가) 01803AD0 > 01803AE0 // 16*1 = 16
SD:01803AE0| 00000000 0000030D 00000004 1812434D ............MC..
SD:01803AF0| 00900C0C 00000004 03000004 0000030C ................
SD:01803B00| 0000030E 00000000 00000000 00000000 ................
SD:01803B10| 00000004 00000001 30730000 00000000 ..........s0....
SD:01803B20| 00000200 00000036 00000000 00000000 ....6...........
SD:01803B30| 01D6371C 00901FE8 00901F68 0000081C .7......h.......
SD:01803B40| 01D6381C 01D6379C FFFFFFF1 0000030E .8...7..........
SD:01803B50| 01D6379C 01D6371C 00000A73 01DA6B00 .7...7..s....k..
SD:01803B60| 00000000 18014B03 000004C4 01DA6B00 .....K.......k..

 

 

 r14 :0x18122CA2 

 R13 (SP) : 0x1803AD0

 

원래 0으로 채워져 있던 순백의 Stack 영역에 push,pop  

  push 했던 자리 > 다시 0x0으로  X 

     > SP만 옮김 >  값 : Clear X

 

 >  특정 Stack에서 가장 많이 사용된 양 : 0x0가 아닌 주소가 바로 Stack을 최대로 많이 사용 했을 때의 값

     > System여러개 사용 > Stack의 값 모니터링 

        >최대로 많이 사용 되었을 때의 Stack의 크기를 알 수 있음.

 

 일단 줄 수 있는 만큼 크게 Stack을 줌 > Test

  적당한 Stack 크기를 잡음 //  Stack 최대 사용 test

 >  최대 크기를 전체 Stack의 크기의 3/4 인 System

    > Stack이 모자라서 Overflow나는 일 X

ex)

 Stack의 start 번지 : 0x1000,

  가장 많이 push를 해서 쌓았을 때의 주소 : 0x400

  >  0x1000-0x400 = 0xC00

// 16진수 계산은 10진수로 변환 후 해야함

 

0xC00 : 전체 Stack Size의 3/4을 차지하게 하려면 0xC00 X 4/3 = 0x1000

//0xC00 이 3/4 차지 > 4/3 을 곱하면 전체 크기를 알 수 있음

    >, 0x1000부터 ~ 0x2000 까지를 Stack으로 잡으면 문제 없음

// 전체크기 0x1000 = 4096

'임베디드 > 임베디드 레시피' 카테고리의 다른 글

linked list, Queue  (0) 2024.12.11
함수 포인터와 실행 주소 변경  (0) 2024.12.08
stack 메모리 dump  (0) 2024.12.07
stack : 함수를 불렀을때  (1) 2024.12.06
stack initialization  (0) 2024.12.05