entry-armv.S 파일에서는
stubs_start
...
stubs_end
vectors_start
...
vectors_end
순서로 코드가 작성되어 있는데 이를 trap_init() 함수에서는
memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);
memcpy((void *)vectors + 0x200, __stubs_start, __stubs_end - __stubs_start);
로 복사한다.
0xffff0000 에 vectors_start 부분부터 복사해놓고
0xffff0200 에 stubs_start 부분부터 복사하게 된다.
따라서
stubs_end
stubs_start <--x--> vector_start 라고하면 stubs_offset 값은
vectors_start<--0x200--> stubs_start <--x--> stubs_end (stubs_offset의 위치)
로 바뀌게 된다.
stubs_offset 값은 __vectors_start + 0x200 - __stubs_start = 0x200 + x 이니깐
재배치한 후의 stubs_end와 같은 위치를 가리키게 된다.
따라서 상대주소로 점프하는 b 명령어가 정상적으로 작동한다.
댓글 없음:
댓글 쓰기