Critical Region은 공유 자원을 보호하는 가장 기본적인 동기화 요소입니다.

KeEnterCriticalRegion 함수로 Critical Region에 진입하며 KTHREAD의 KernelApcDisable에서 1을 뺍니다. 반대로 KeLeaveCriticalRegion 함수로 Critical Region에서 벗어나며 KernelApcDisable에 1을 더합니다. KernelApcDisable의 초기값은 0 입니다. 이렇게 해서 노멀 APC를 차단합니다. 하지만 스페셜 APC는 차단하지 않습니다.

Critical Region으로 진입하더라도 IRQL은 변화시키지 않고 계속 PASSIVE_LEVEL에서 실행됩니다. 커널은 KTHREAD의 KernelApcDisable을 확인하여 이 값이 -1이라면 노멀 APC를 실행하지 않도록 합니다. 하지만 스페셜 APC는 APC_LEVEL에서 실행되기 때문에 PASSIVE_LEVEL에서 실행되고 있는 Critical Region은 스페셜 APC에게 실행권을 빼앗길 수 있습니다. (선점 당할 할 수 있습니다.)

APC_LEVEL에서 Critical Region으로 진입했다면 계속 APC_LEVEL에서 실행되며 PASSIVE_LEVEL에서 실행되는 노멀 APC는 KernelApcDisable의 여부와 상관 없이 실행이 차단 됩니다. 그리고 같은 IRQL에서 실행중인 스페셜 APC도 차단됩니다.

윈도우 2003에서는 새로운 함수가 추가 되었는데, 바로 Guarded Region입니다.

이 Guarded Region은 노멀 APC와 스페셜 APC를 모두 차단합니다. KeEnterGuardedRegion 함수로 Guarded Region에 진입하며 KTHREAD의 SpecialApcDisable에 1을 뺍니다. KeLeaveGuardedRegion으로 Guarded Region에서 벗어나며 SpecialApcDisable에 1을 더합니다. 커널은 SpecialApcDisable의 상태를 보고 노멀 APC, 스페셜 APC 모두 차단합니다.

앞의 Critical Region은 PASSIVE_LEVEL에서는 노멀 APC만 차단되고 APC_LEVEL에 와서야 노멀, 스페셜 APC 모두가 차단됩니다. 하지만 Guarded Region은 IRQL을 변화시키지 않고 스페셜 APC를 차단한다는 것입니다. 즉 PASSIVE_LEVEL에서도 노멀, 스페셜 APC가 모두 차단됩니다.

이것은 윈도우 2003 커널이 그렇게 바뀌었기 때문이고 2003 이전 운영체제인 2000, XP에서는 모든 APC를 차단하려면 IRQL을 APC_LEVEL로 높이는 수 밖에 없습니다.

윈도우 2003에 새롭게 추가된 Guarded Mutex는 내부적으로 이 Guarded Region을 이용합니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

03 February 2008