태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
Blog | Tag | Local | Media | Guest | Login  RSS
Internals Study에 해당되는 글 2건
이 전 과정에서 너무 고생을 해서인지 의외로 이번 세미나는 쉽게 진행됐습니다. 일단 다음 주는 간단하게 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로 이루어진 숫자를 기반으로 해당 서비스를 찾아가서 실행 합니다.


Name
Password
Homepage
비밀글 (Secret)
사전 지식이 없었던 만큼 정말 어려웠던 내용이 였습니다.
고생 많으셨습니다.
별로 아는 것도 없으면서 수업을 진행하니 어려움이 많네요...^^

[수업 내용]
http://maystyle.tistory.com/entry/지루한-인터럽트-한방에-알아보자

[진행]
민성

[참석]
준상, 동조, 민우형님, 준규선배, 조현정 과장님

[진도] 
p140 ~ p170

[교제 내용]
전체적으로 살펴 본다면 이렇게 정리 될 수 있습니다.

Windows 는 IRQL 이라는 자체적인 우선 순위를 통해 인터럽트 혹은 여러가지 발생 가능한 요청 사항을 수행하게 됩니다.

이때 상위 레벨의 IRQL을 갖는 인터럽트가 수행된다면, 하위 레벨의 Thread는 컨텍스트 스위칭이 되면서 하위의 모든 IRQL 레벨은 마스킹 되게 됩니다.

그렇다면 프로그램들이 수행 될때 어떻게 IRQL을 이용하는지 설명하겠습니다.
만약 IRQL이 없고 그냥 평등하게 Thread가 수행되게 된다 라고 가정하게 되고 Memory Access 나 Hard Disk Access가 필요하게 되면 어떻게 될까요?

당연히 Access를 통해 Data를 로드하는 시점에서 해당 Thread는 멈춰야 합니다. 이를 보장하기 위해 보통 사용자 Thread가 수행되는 Passive 레벨 윗단에 APC라는 Memory를 Access 하기 위한 인터럽트를 두고 해당 인터럽트 발생시 유저 Thread는 실행을 멈추고, APC 단의 Thread 수행을 기다리게 됩니다. 이를 통해 한 Thread가 커널단... 즉 실제 memory 나 paging memory에 접근하는 로직을 수행할 수 있습니다.

그리고 윗단 DPC 이상은 예를 들면 IO 및 인터럽트가 발생하는 레벨인데, 이전에 설명했듯이 특정 IO가 발생할 경우 HAL은 해당 IO의 IRQL을 결정해 주고,  해당 IRQL에 맞춰 CPU는 인터럽트를 처리합니다. 그렇다면 DPC/Dispatch 는 뭘까요?

책에서 보듯이 해당 레벨은 소프트웨어적으로 발생하는 인터럽트입니다.
제가 설명드렸다 시피 IDT 테이블에는 연관되 일어나는 여러 인터럽트들이 정의 되어 있을 수 있습니다. 이때 한 인터럽트가 완전히 수행 될때 까지 다음 인터럽트가 기다린다거나, 조금 늦게 수행 되도 되는 인터럽트가 존제 한다거나, 기타 Thread의 수행 시간이 너무 길어질 경우 CPU의 점유 현상이 나타나고 이를 방지 하기 위해 일단 늦게 수행되도 괜찮은 경우 DPC 큐에 넣어 수행을 지연시킵니다. 그리고 윗단의 인터럽트가 종료 되면 DPC레벨에서 해당 인터럽트를 꺼내 수행하게 됩니다.


Name
Password
Homepage
비밀글 (Secret)