Windows , IIS

32비트, 64비트 시스템 서비스 디스패칭

SungWookKang 2015. 7. 16. 19:06
반응형

32비트, 64비트 시스템 서비스 디스패칭

  • Windows Server 2008

 

[32비트 시스템 서비스 디스패칭]

펜티엄2 이전의 x86 프로세서에서 윈도우는 트랩을 유발하는 int 0x2e(10진수 46)명령을 사용했다. 윈도우 IDT 엔트리 46을 시스템 서비스 디스패처를 가리키게 설정한다.

 

X86 펜티엄2 프로세서나 상위 버전의 경우 윈도우는 sysenter 명령을 사용한다. 이 명령은 빠른 시스템 서비스 디스패처를 위해 인텔이 특별히 정의한 명령이다. 이 명령을 지원하기 위해 윈도우는 부팅 시점에 커널의 시스템 서비스 디스패처 루틴 주소를 이 명령과 연관된 머신 특정적인 레스터(MSR)에 저장한다. 이 명령을 실행하면 커널모드로 변경되어 시스템 서비스 디스패처가 실행 된다.

 

시스템 서비스 번호는 EAX 프로세서 레지스터를 통해 전달되고 EDX 레지스터는 호출자의 인자 목록을 가리킨다. 유저모드로 복귀하기 위해 시스템 서비스 디스패처는 일반적으로 sysexit 명령을 실행한다. 프로세서에 싱글 스텝 플래그가 활성화 되어있는것과 같은 일부 경우에 시스템 서비스 디스패처는 iretd를 사용한다. 커널 디버거로 sysexit 명령을 스텝 오버로 실행하면 정의되지 않은 시스템 상태가 되어 크래시로 이어질 수 있기 때문이다.

 

일부 오래된 어플리케이션의 경우 지원되지 않는 동작으로 인해 시스템 호출을 직접 하려고 int0x2e 명령을 하드코딩한 경우도 있다. 윈도우는 sysenter 명령을 지원하는 시스템일지라도 int 0x2e의 트랩 핸들러를 등록해 이 메커니즘의 사용을 계속 유지한다.

 

 

 

K6와 그 상위 32비트 AMD 프로세서의 경우 윈도우는 x86의 sysenter 명령과 유사한 기능을 하는 syscall 명령을 사용한다. 커널은 디스패치 작업을 완료한 후에 sysret명령을 실행한다. 부팅 시점에서 윈도우는 자신이 실행되는 프로세서의 유형을 탐지해 SharedUserData 구조체에 정확한 코드에 대한 포인터를 저장함으로써 사용할 적절한 시스템 호출 코드를 설정한다.

 

 

[64비트 시스템 서비스 디스패칭]

x64 아키텍처에서 윈도우는 시스템 서비스 디스패칭 시에 AMD K6의 syscall 명령과 유사하게 동작하는 syscall 명령을 사용하며 EAX 레지스터를 통해 시스템 호출번호를 전달하고 레지스터를 통해 최초 4개의 인자를 전달하고 4개를 초과하는 나머지 인자는 스택을 통해 전달한다.

 

IA64 아키텍처에서 윈도우는 epc(Enter Privileged Mode)명령을 사용한다. 최초 8개의 시스템 호출 인자는 레지스터를 통해 전달되고 나머지는 스택을 통해 전달된다.

 

 

 

[참고자료]

Windows Internals

 

 

반응형

'Windows , IIS' 카테고리의 다른 글

익스큐티브 객체  (0) 2015.07.16
커널모드 시스템 디스패칭과 서비스 디스크립터 테이블  (0) 2015.07.16
윈도우 오류 보고  (0) 2015.07.16
처리되지 않은 예외  (0) 2015.07.16
예외 디스패칭  (0) 2015.07.16