'인터럽트'에 해당되는 글 1건

  1. 2014.03.31 윈도우 커널레벨에서의 인터럽트 레벨
WDM/Architecture2014.03.31 16:38

하드웨어 또는 소프트웨어의 인터럽트가 발생하면 프로세서(CPU가 해당이 되겠지요..간혹 프로세스와 프로세서를 잘못보는 분이 계셔서)는 현재의 작업을 중지합니다. 프로세서는 인터럽트에 대해 우선 순위를 부여하고 우선 순위가 높은 인터럽트를 먼저 처리를 합니다.

커널레벨에서의 프로그래밍을 하거나 함수를 사용할 때 인터럽트레벨이 중요합니다. 프로그래머가 사용할 수 있는 인터럽트 레벨은 0~2까지 밖에 사용할 수 없습니다. 상위권의 인터럽트레벨은 하드웨어가 사용하게 됩니다.

이는 당연한 이치이지만, 커널레벨에서의 프로그램이 드라이버로 작성이 되지만 하드웨어 입장에서는 결국 소프트웨어이기 때문에 하드웨어보다 소프트웨어가 처리 우선순위가 높다는 것은 말이 안되기 때문입니다.

 

함수에 대한 중요성을 예를들면

 

NTSTATUS ZwCreateFile(
  _Out_     PHANDLE FileHandle,
  _In_      ACCESS_MASK DesiredAccess,
  _In_      POBJECT_ATTRIBUTES ObjectAttributes,
  _Out_     PIO_STATUS_BLOCK IoStatusBlock,
  _In_opt_  PLARGE_INTEGER AllocationSize,
  _In_      ULONG FileAttributes,
  _In_      ULONG ShareAccess,
  _In_      ULONG CreateDisposition,
  _In_      ULONG CreateOptions,
  _In_opt_  PVOID EaBuffer,
  _In_      ULONG EaLength
);
http://msdn.microsoft.com/en-us/library/windows/hardware/ff566424(v=vs.85).aspx

 

 

ZwCreateFile함수의 MSDN 맨마지막 쪽을 보면

 

 IRQL  PASSIVE_LEVEL (see Remarks section)

 

이라고 되어 있습니다. 즉, 이 함수는 APC_LEVEL 이상의 인터럽트인 상태에서 사용하게 되면 BSoD가 발생하게 됩니다.

 

 

 

IRQL

설명 

 인터럽트 없음

 PASSIVE_LEVEL

 정규 스레드 실행 

 소프트웨어 인터럽트

 APC_LEVEL

 비동기 프로시저 호출 발생 

 

 DISPATCH_LEVEL

 스레드 스케쥴링 ,지연 프로시저 호출 실행

 하드웨어 인터럽트

 DIRQL

 디바이스 인터럽트 요구 레벨 핸들러 실행 

 

 PROFILE_LEVEL

 프로파일링 타이머

 

 CLOCK2_LEVEL 

 클럭

 

 SYNCH_LEVEL

 동기화 레벨

 

 IPI_LEVEL

 프로세서간 인터럽트 레벨

 

 POWER)LEVEL

 전원 장애 레벨

 

모든 스레드는 보통 제일 하위의 PASSIVE_LEVEL의 인터럽트에서 실행되며, 스케쥴링은 우선 순위의 값을 이용하여 다음에 어떤 스레드가 실행할지를 판단합니다.

 

보통 드라이버 작성 시 일정 정보를 저장하기 위해 List에 관리하게 되는데, 이때 삽입이나 삭제를 할 경우 PASSIVE_LEVEL에서 작업을 하게 되면 동시 접근이 되어서 메모리 오류가 발생할 수 있는 소지가 다분합니다. 이 부분은 유저레벨에서도 마찬가지겠지요..

그래서 인터럽트의 레벨을 올려, 즉, IRQL의 레벨을 올려서 삽입, 삭제시 작업을 하게 됩니다. 이때 드라이버에서 SpinLock를 사용하여 IRQL을 DISPATCH_LEVEL까지 올려 줍니다.

 

꼭 드라이버 작성 시 함수를 쓰실 때 어느 IRQL에서 작동이 되는 함수인지 확인하고 코드를 하는 습관을 들이신다면 나중에 도움이 많이 될 듯 싶습니다. 읽어주셔서 감사합니다.

Posted by 쫑경