2011년 7월 16일 토요일

stubs_offset

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 명령어가 정상적으로 작동한다.

댓글 없음:

댓글 쓰기