본문 바로가기

Internals Study

3장 - 2 (Exception, System Service Call) 세미나 후기

이 전 과정에서 너무 고생을 해서인지 의외로 이번 세미나는 쉽게 진행됐습니다. 일단 다음 주는 간단하게 Object에 대해서 이야기 하고, Windows 튜닝 방안에 대해 김동조씨기 진행할 예정입니다.

[수업 내용]
예외 디스패칭 :
http://maystyle.tistory.com/119 
Structured Execption Dispatching :
http://maystyle.tistory.com/118
시스템 서비스 디스패칭 : http://maystyle.tistory.com/121
커널 모드 시스템 서비스 디스패칭 : http://maystyle.tistory.com/122

[진행]
민성

[참석]
현정과장님, 준규대리님, 민우 형님, 준상씨, 동조씨,

[진도]
p171 ~ p188

[교재 내용]

- 인터럽트

인터럽트는 소프트웨어로 인해 발생합니다. 예외는 커널에서 발생하는데, 일단 예외가 발생하게 되면 먼저 현재 실행 내용을 트랩하여 저장하고, 해당 예외는 먼저 서브 시스템의 디버거 포트에서 처리를 시도합니다. 만약 처리가 되지 않았다면, 다시 예외 처리기는 사용자 모드로 전환하고 현재까지의 실행 내역을 트랩하여 사용자 스택에 복사하고 프레임 기반의 예외 핸들러를 찾기 위한 루틴을 실행합니다. (프로그램이 실행 되게 되면 해당 프레임을 스텍에 차곡 차곡 쌓는데, 에러 이전으로 돌아가기 위한 동작으로 보입니다.) 역시 못찾았다면, 다시 디버거를 호출하고, 이에도 실패하게 되면 최종적으로 커널은 스레드의 프로세스와 연관된 예외 포트에 메세지를 보내고 해당 프로그램을 종료하게 됩니다.

아 그리고 Drwtsn32.exe 와 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug 도 잊지 마시기 바랍니다. SQL Management Studio가 설치되면 자동으로 VS2005가 설치되고 해당 설정이  '0' 으로 변경됩니다. 1로 바꿉시다...^^

- 시스템 서비스 디스패칭

일단 용어 정리 부터합시다. 시스템 서비스랑 사용자 App에서 호출이 가능한 Windows 의 Native 함수를 말합니다.

위 그림으로 설명을 하자면 'NtWriteFile'이 시스템 서비스에 해당 됩니다. 자 사용자의 App가 WriteFile을 호출하면 실제로 Kernel32.dll의 NtWriteFile이 해당 동작을 수행 하게 되는데, 항상 System Call의 경우 idt 의 0x2E 인터럽트가 발생하게 되고, 사용자 동작이 트랩이 된 이후에 KiSystremService 라 불리우는 시스템 서비스 처리 함수가 시스템 서비스 디스패처 테이블을 확인하고, 해당 서비스를 실행하게 됩니다.

그렇다면 이 Table은 어떤 형식으로 시스템 서비스를 실행할까라는 생각이 듭니다.

Windows는 2개의 내장 시스템 서비스 테이블을 가지고 있습니다.확장하면 4개 까지 지원이 가능한데, 일단 KeServiceDescriptorTable 은 핵심 Windows 내장 함수를 KeServiceDescriptorTableShadow 는 서브시스템을 맞게 됩니다. 자 쓰래드는 자신의 시스템 서비스 테이블을 가르키는 System Service number를 가지고 있습니다. 인덱스는 먼저 KeServiceDescriptorTable 인가 KeServiceDescriptorTableShadow 를 가르키게 되고, 일단 누군지 정해지면 0~11 bit로 이루어진 숫자를 기반으로 해당 서비스를 찾아가서 실행 합니다.