APC(Asychronous Procedure Call)를 이용한 커널 동기화 기법

KeEnterCriticalRegion 함수는 Thread의 User APC와 Normal Kernel APC를 Disable하고, KeEnterGuardedRegion 함수는 Thread의 모든 Special Kernal APC(KernelMode APC)를 Disable합니다. 드라이버가 KeEnterCriticalRegion 함수를 호출하면 KeLeaveCriticalRegion 함수를 호출할 때까지 User APC와 Normal Kernel APC를 Disable를 합니다. KeEnterCriticalRegion 함수를 호출한 Caller는 필요한 작업을 한 후에 가능한 빨리 KeLeaveCriticalRegion 함수를 호출해야 합니다. KeEnterGuardedRegion 함수도 마찬가지입니다. 이 함수들은 중복해서 사용할 수 있고, 각각의 진입 함수는 탈출 하는 함수와 매칭되어야 합니다. 드라이버는 공유되는 자원을 한 순간에 한 번만 접근하기 위해 Critical Region(Guarded Region)을 사용할 수 있습니다. 

APC의 타입
Asychronous Procedure Call(APC)는 비동기로 실행되는 함수입니다. APC는 DPC와 비슷하지만 목적이 다릅니다. APC는 특정한 Thread의 Context에서 실행되며 파일 시스템 드라이버와 파일 시스템 필터 드라이버 이외의 다른 드라이버는 APC를 직접 사용하지 않습니다. 그래서 파일 시스템 관련 드라이버를 개발하는 프로그래머는 APCs가 어떻게 동작하는지 알아야 할 필요가 있습니다.

1. User APC:
User APC는 User Mode에서 실행되고, 오로지 I/O를 요청한 Thread가 Alertable Wait 상태에 있을 때 실행됩니다. 운영체제는 QueueUserApc와 Overlapped I/O와 같은 메커니즘을 구현하기 위해 User APC를 사용합니다.


2. Normal Kernel APC:
Normal Kernel APC는 Kernel Mode에서 IRQL이 PASSIVE_LEVEL일 때, 동작합니다. Normal Kernel APC는 모든 User Mode 코드보다 먼저 실행됩니다. Normal Kernel APC는 보통 파일 시스템과 파일 시스템 필터 드라이버에서 사용합니다.


3. Special Kernel APC:
Special Kernel APC는 Kernel Mode에서 IRQL이 APC_LEVEL일 때, 동작합니다. 이 말은 PASSIVE_LEVEL에서 동작하는 User Mode 코드와 Kernel Mode 코드보다 먼저 실행된다는 것을 의미합니다. 운영체제는 I/O Request Completion과 같은 작업을 처리하기 위해 Special Kernel APC를 사용하는데, I/O를 요청한 Context와 I/O가 완료된 후의 Context는 같아야 하기 때문에 Special Kernel APC를 통해 처리하는 것입니다.

1: kd> dt _ETHREAD
nt!_ETHREAD
   +0x000 Tcb              : _KTHREAD   
nt!_KTHREAD
   +0x084 KernelApcDisable : Int2B
   +0x086 SpecialApcDisable : Int2B

KTHREAD->KernelApcDisable과 KTHREAD->SpecialApcDisable은 Short(2 Byte)로 구현되어 있습니다. 그래서 중복 획득과 반환에 있어서 추적과 관리가 편한 것입니다. Thread가 Block Status에서 다시 Running Status가 되려면 Interrupt가 완료되고 Device IRQL → DISPATCH_LEVEL → APC_LEVEL → PASSIVE_LEVEL로 IRQL이 감소하는데, 특정 Thread가 Guard Region을 사용하면 Context Switching 하는 도중에 APC_LEVEL에서 길목이 막혀버립니다. 만약 Critical Region을 사용하면 PASSIVE_LEVEL까지는 도달했지만 User Mode로 가는 마지막 길목이 막혀버리겠죠.

댓글 없음:

댓글 쓰기

Microcurruption Addis Ababa

11 Microcurruption의 Addis Ababa다. 4482: 3f40 0a00 mov #0xa, r15 4486: b012 5045 call #0x4550 <putchar> 448a: 8193 0...