Windows SubSystem( kernel32.dll , ntdll.dll)의 API을 호출하게 되면 결과적으로는 Windows의 System Service Routine 를 호출하게되는경우가 많습니다. 이러한 과정에서 User Level의 Function Call을 Kernel Level로 전환하는 과정이 필요하게 됩니다. 이러한 과정을 위해서 Windows 및 x86, x64 Family에서는 System Service Dispatcher를 제공합니다.
System Service Dispatching
- Pentium II 이전의 x86
Pentium II 이전의 x86 시스템에서는 int 0×2e을 통해서 해당 Service를 Trap하는 방법을 사용합니다. Trap은 실행 Thread를 kernel Mode로 전환하고 EAX와 EBX를 통해서 Service Table의 Index와 Parameter를 전달하는 방식으로 System Service Dispatching을 수행합니다.
- Pentium II 이후의 x86
Pentium II 이후의 x86 에서는 sysenter와 sysexit 를 통해서 System Service Dispatching을 수행 되도록 합니다. EAX에는 Service Table의 Index를 EDX에는 Parameter의 Pointer 넣어 줌으로 System Service Routine를 수행합니다. 이러한 작업이 가능하도록 Windows는 부팅시에 해당명령과 연결된 Register에 SSDT의 포인터를 저장하는 작업을 하고 있습니다. sysenter instruction이 실행되는 시점에서 System은 MSRs( Model-Specific Registers )로 부터 Kernel 진입후 사용하게될 CS, EIP 정보를 Setting 하고 Kernel 진입시 사용하게 될 SS ESP 값을 가져와 Kernel Level로 진입하게 됩니다.
- K6 이후 AMD Process
AMD의 Process는 Pentinum II 이후 모델과 거의 비슷한 방법으로 System Service Dispatching을 이루어 냅니다. sysenter 와 비슷한 syscall instruction을 사용하며 EDX 대신 스택을 이용한 Parameter 전달을 합니다.
- x64
x64의 경우 AMD와 같은 방식으로 System Service Dispatching이 이루어 지며 x64의 Calling convention과 같은 방식으로 Parameter를 전달하도록합니다.
KiSystemService
KiSystemService Routine은 System Service Dispatching이 이루어진 후 실제로 Service Routine를 호출해주는 부분입니다. KiSystemService는 User Level로 부터 전달된 Parameter를 Kernel Level 스택으로 옮기고 각각 Index에 해당하는 Service Routine를 호출해 주는 역할을 합니다. 이러한 과정은 Interrupt를 Disable후 이루어지게 되고 이러한 이유에서 안전하게 System Service Routine이 호출될 수 있도록 합니다.
최근 답글