상세 컨텐츠

본문 제목

SYSENTER 와 INT 0x2E

청강컴정/시스템프로그래밍

by luckey 2009. 4. 16. 19:29

본문

사용자 특권 즉 어플리케이션 레벨에서 커널특권으로 이동할 경우 사용되는 명령어는 SYSENTER과 INT 0x2E 가 있다.
SYSENTER과 INT 0x2E에 대해서 일단 알아보도록 하자.

  INT 0x2E SYSENTER
사용하는 운영체제 Windows XP이전버전  Windows XP와 이후버전 
링 트랜젝션 TSS메모리에 기술된 내용을 사용해서 CPU가 자동으로 스택 교환 작업을 수행한다. MSR레지스터에 기술된 내용을 사용해서 CPU가 자동으로 스택 변경 작업을 수행한다.
수행 시간에 따른 부하 비교적 수행 시간이 오래 걸린다. 수행 시간이 짧다. 
제어 이행 위치 0x2E 게이트에 기록된 셀렉터와 오프셋  MSR 레지스터에 기술된 내용 
돌아올 복귀 주소 보관 스택 교환 작업에서 이미 복귀 주소가 스택에 저장되어 있으므로, 간단하게 IRET명령 만으로 원래의 코드로 복귀가 가능하다.  스택 교환 작업이 아닌 스택 변경작업을 수행했기 때문에 반환될 원래 코드의 주소는 어디에도 보관되어 있지 않다.
되돌아 가는 주소는 항상 EDX레지스터에 담겨져 있는 상태로 SYSEXIT명령이 실행되어야 한다. 
원래 스택으로 환원 IRET명령을 수행하는 시기에 원래 스택으로 스택 교환 작업이 이루어 진다.  SYSEXIT 명령을 실행하기 전에 반드시 ECX 레지스터에 원래의 스택 주소를 기록해 두어야 한다. 

위의 표에서 볼 수 있듯이 SYSENTER는 XP 이후 버전부터 사용이 가능하다.
SYSENTER의 장점은 수행 시간에 따른 부하가 적다 즉 클럭수가 적다는 것이 최대의 장점이라고 볼 수 있으며 그외 나머지는 INT 0x2E가 훨씬 좋다고 한다. 하지만 SYSENTER의 부하가 적다는 장점이 너무 크게 작용되어서 다른 부분들은 그냥 감수하고 사용을 하거나, SYSENTER와 INT 0x2E를 혼합하여서 사용을 하기도 한다고 한다.


위의 그림에서 보듯이 사용자 특권에서 SYSENTER 명령어를 실행하면 바로 커널특권의 KiFastCallEntry를 통해서 커널에 진입하게 되며 SYSEXIT를 통해서 커널을 빠져 나오게 된다.

INT 0x2E 에서도 역시  사용자 특권에서 커널특권으로 이동하게 되면 KiSystemService라고 하는 커널 내부의 함수를 호출하게 된다.

실행되는 것은 비슷하지만 사용되는 함수가 틀리고 내부적으로 동작하는 방식도 틀릴것이다. 그래서 나눠 두었겠지..;;;

그럼 저 두가지를 어떻게 짬뽕을 해서 사용할 것인가에 대해서 알아보도록 하자.

XP에서 윈도우 2000과의 호환을 유지하기 위해서는 두가지 방식을 모두 사용하여야 한다.

즉 SYSENTER를 호출하여 KiFastCallEntry를 통해서 커널에 진입한후 어차피 같은 커널레벨 안에서의 동작이기 때문에 KiSystemService를 호출한다.  이렇게 함으로써 SYSENTER과 INT 0x2E 즉 윈도우 XP와 윈도우 2000과의 호환서을 유지할 수 있게 되는 것이다.

관련글 더보기

댓글 영역