본문 바로가기
Embedded System

Code 를 특정 Offset으로 카피후 Jump 하기

by lifeseed 2010. 10. 13.
Nor Flash에서 수행되는 부트코드의 경우, Nor Flash의 부트 데이터를 DRAM에 카피한 후 동일한 위치의 DRAM으로 PC를 옮겨야 하는 상황이 발생한다.

예를 들어 DRAM의 Base Address 가 0x1000 0000번지, Nor Flash의 Base Address 가 0x0000 0000 이라고 하자.

0x0000 0000     cmd 1
0x0000 0004     cmd 2
0x0000 0008     cmd 3
0x0000 000C    cmd 4
0x0000 0010     cmd 5
0x0000 0014     cmd 6
0x0000 0018     cmd 7
0x0000 001C    cmd 8
0x0000 0020     cmd 9
0x0000 0024     cmd 10
0x0000 0028     cmd 11
0x0000 002C    cmd 12

cmd2 ~ cmd4 까지가 Nor의 Code를 DRAM으로 카피하는 구문이라면, 최소한의 cmd (5~9)를 실행후 cmd10을 DRAM의 위치에 있는 명령을 수행하려 할 것이다.
이때 사용될 명령이 아래 명령이다. (ARM 9)

 ldr r0, =0x10000000
 mov r1, pc                     /* r1에 PC를 저장 이때의 PC는 ARM9의 경우 +8값이 저장된다.  why 명령어 Pipe line 상 PC가 두 명령을 앞서간다. */
 add r1, r1, r0
 
 add pc, r1, #4               /* PC를 r1에 저장하는 순간 실제 가르키는 CP의 위치이다. 그러나 PC 변경후 다음 명령이 수행되어야 하므로, +4를 해준다. */
 add r14, r14, r0             /* linked register */