저녁먹고, 집에가서 계속 어제 방식대로 해석하고 고민해봤는데... 도무지 이해가 안가서,
메뉴얼을 검색해보니,
64비트 모드에서는 'RIP-relative addressing'라는 새로운 addressing mode를 지원하고 있더군요..
AMD64 vol.1 - ch2.2.5 참조
RIP-relative addressing—that is, addressing relative to the 64-bit instruction pointer (also called program counter)—is available in 64-bit mode. The effective address is formed by adding the displacement to 'the 64-bit RIP of the next instruction.'
그러므로, 위의 해석에 비추어 볼때,
init_rsp(%rip) 는
[이 명령 다음의 rip가 가리키는 주소] + [rip 로부터의 init_rsp까지의 옵셋]
으로 해석하는 것이 맞을 듯 싶습니다.
(뭐, 원래 이렇게 해석을 했지만요??)
init_rsp(%rip)
init_rsp -> 0xFFFFFFFF80200190 : 가상주소 위치 (nm vmlinux 참조)
rip -> 0x200149 : mov init_rsp(%rip), %rsp 다음 명령의 주소
이 될 것입니다.
0xFFFFFFFF80200190은 가상주소이므로 0x200190으로 변경된다.
따라서 0x200190 - 0x200149 = 0x47 = 71.
그래서 mov (0x200149 + 71), %rsp 요렇게 해석이 될것입니다.
여기서 0x200149+71 은 init_rsp의 물리주소가 되겠죠.
따라서, rsp에는 init_rsp의 물리주소가 가리키는 8바이트 값이 들어가게 될것입니다.
참고로 .org 0x100은 이 코드 섹션의 위치 카운터(=ffffffff80200000)에서
0x100 만큼 떨어진 위치로 해석하는 것을 나타내 주는 것으로 생각됩니다.
[근거] objdump로 vmlinux를 덤프했을 때,
ffffffff8020005d: 00 01 add %al,(%rcx)
ffffffff8020005f: 10 00 adc %al,(%rax)
ffffffff80200061: 10 00 adc %al,(%rax)
...
ffffffff80200100 <startup_64>: -->.org 0x100이 선언된 곳. 요런식으로 다음 위치가 ffffffff80200100 로 조정 되버렸음
ffffffff80200100: 48 31 c0 xor %rax,%rax
ffffffff80200103: 48 0f ba e8 05 bts $0x5,%rax
혹시, 제 생각이 틀렸다면 지적해주시기 바랍니다..
그럼 수고 ^^
아참..노트북 질렀습니다. x60으로요.
메뉴얼을 검색해보니,
64비트 모드에서는 'RIP-relative addressing'라는 새로운 addressing mode를 지원하고 있더군요..
AMD64 vol.1 - ch2.2.5 참조
RIP-relative addressing—that is, addressing relative to the 64-bit instruction pointer (also called program counter)—is available in 64-bit mode. The effective address is formed by adding the displacement to 'the 64-bit RIP of the next instruction.'
그러므로, 위의 해석에 비추어 볼때,
init_rsp(%rip) 는
[이 명령 다음의 rip가 가리키는 주소] + [rip 로부터의 init_rsp까지의 옵셋]
으로 해석하는 것이 맞을 듯 싶습니다.
(뭐, 원래 이렇게 해석을 했지만요??)
init_rsp(%rip)
init_rsp -> 0xFFFFFFFF80200190 : 가상주소 위치 (nm vmlinux 참조)
rip -> 0x200149 : mov init_rsp(%rip), %rsp 다음 명령의 주소
이 될 것입니다.
0xFFFFFFFF80200190은 가상주소이므로 0x200190으로 변경된다.
따라서 0x200190 - 0x200149 = 0x47 = 71.
그래서 mov (0x200149 + 71), %rsp 요렇게 해석이 될것입니다.
여기서 0x200149+71 은 init_rsp의 물리주소가 되겠죠.
따라서, rsp에는 init_rsp의 물리주소가 가리키는 8바이트 값이 들어가게 될것입니다.
참고로 .org 0x100은 이 코드 섹션의 위치 카운터(=ffffffff80200000)에서
0x100 만큼 떨어진 위치로 해석하는 것을 나타내 주는 것으로 생각됩니다.
[근거] objdump로 vmlinux를 덤프했을 때,
ffffffff8020005d: 00 01 add %al,(%rcx)
ffffffff8020005f: 10 00 adc %al,(%rax)
ffffffff80200061: 10 00 adc %al,(%rax)
...
ffffffff80200100 <startup_64>: -->.org 0x100이 선언된 곳. 요런식으로 다음 위치가 ffffffff80200100 로 조정 되버렸음
ffffffff80200100: 48 31 c0 xor %rax,%rax
ffffffff80200103: 48 0f ba e8 05 bts $0x5,%rax
혹시, 제 생각이 틀렸다면 지적해주시기 바랍니다..
그럼 수고 ^^
아참..노트북 질렀습니다. x60으로요.
댓글 3
.