리눅스 커널에서 SS 레지스터의 쓰임에 대해..
글쓴이: resonancme / 작성시간: 금, 2012/01/13 - 8:28오후
안녕하십니까 KLDP에서 고수님들께 많은 도움을 얻고 있는 리눅스 커널 초보자입니다^^;;
제가 궁금한 것은 DS 레지스터와 SS 레지스터에 관한 것입니다.
제가 알기로 데이터 세그먼트 영역에 각 데이터들과 스택이 포함되어 있고 SS 레지스터가 DS레지스터의 값을 가지고 있다고 합니다
세그먼트 셀렉터가 세그먼트 레지스터에 저장되므로 DS 레지스터만 있으면 디스크립터의 베이스어드레스와 오프셋을 이용해 스택이 있는 위치까지도
접근이 가능할 텐데 왜 SS레지스터가 필요한지 의문입니다. SS 레지스터에는 스택 세그먼트 셀렉터가 있다고 알고있는데 어차피 스택은 데이터 세그먼트 영역에
포함되어 있으므로 DS 레지스타만 있으면 되지 않나요??
책을 봐도 이해가 안되는군요 ;;; 무언가 연결이 안되서 질문올립니다. 고수님들 도와주세요!
Forums:
원래 stack pointer의 기본 세그먼트 지정은 SS 레지스터 입니다.
일반적인 데이터 처리 명령은 DS 레지스터를 기준으로 진행되고
그외의 경우 segment override를 통해 ES, FS, GS 같은 레지스터도 사용합니다.
그러나 PUSH와 POP의 경우 segment override 자체가 안됩니다.
CALL, RET, IRET등도 마찬가지입니다.
SP (stack pointer)와 BP (base pointer)의 기준 세그먼트 레지스터(또는 selector)는
SS입니다. (일반 데이터 처리 명령으로 접근할 경우에는 segment override를 할 수
있으나 위의 문제로 인해 SS를 설정하지 않고서는 정상적인 동작을 수행할 수 없습니다)
즉, x86 아키텍쳐의 설계가 그렇게 되어 있기 때문에 그렇게 사용하는 겁니다.
아키텍쳐 설계가 그렇게되어있다는 건 알겠습니다
하지만 말씀하신걸 다 이해는 못하겠습니다;;
PUSH, POP, CALL, RET, IRET가 segment override 가 안되는 이유를 알려주실수 있을까요?
아니면 DS레지스터에 포함된 주소와 SS레지스터가 가지고 있는 주소(디스크립터의 위치)가 다르다는 말인가요?
x86 segment override
아키텍쳐의 설계가 그렇게 되어 있다는 말의 의미를 이해하지 못하신 듯 합니다.
x86의 segment override는 memory reference operand의 segment register를 변경하는 것을 말합니다.
원하는 opcode의 앞에 1byte segment override prefix를 붙이면 해당 opcode는 지정한 segment register를 사용하여 데이터에 접근합니다. 문제는 위의 스택 관련 명령에서는 memory reference operand를 사용하더라도 SP 레지스터의 변경과는 무관하기 때문에 segment override prefix를 붙여도 stack 조작은 항상 SS 레지스터를 참조합니다. 즉, SS를 override하고 싶어도 못합니다.
덧붙이자면
push dword ptr es:[1000h]
~~~
segment override는 stack 관련 명령에서 위와 같은 형태로 사용됩니다. ret나 iret에서는 immediate 값이 사용되므로 당연히 segment override 지정이 무시됩니다.
문서 편집이 이상하군요.
댓글 달기