오늘은 다른분의 블러그를 참조하고 글을 올리네요 ^^ 책을 보다가 인터럽트 오브젝트라는 놈을
보게 되었는데요.. 궁금한 나머지 인터넷을 조사 +.+
자 소개 해 보겠습니다 ~~ ㅎㅎ
인터럽트 란 외부 장치 등에서 발생된 신호를 cpu에게 알리기 위한 수단입니다 ^^
자 cpu에게 알려줬으니깐 cpu가 작동하겠죠? ㅎㅎㅎㅎ
cpu는 인터럽트 서비스 루틴인 ISR을 등록하기 위해 IoConnectInterrupt DDK 함수를 호출하는데요
여기서 호출할때 인터럽트 오브젝트를 생성한다고 하네요 ^^
인터럽트 오브젝트는 디바이스 ISR의주소와 특정 레벨의 인터럽트를 서로 연관시키는 모든 정보가
들어있다고 하네요 ^^
CPU는 인터럽트 컨트롤러에게 방금 접수된 인터럽트의 IRQ를 질의하여 해당 IRQ를 파악하여 IRQ를 근거로 하여 인터럽트 벡터 테이블의 인덱스로 사용될 벡터 값을 계산해낸다. 인터럽트 벡터 테이블의 해당 인덱스에는 인터럽트 게이트가 존재하며 이 게이트 내에는 디스패치 코드에 대한 세그먼트 실렉터와 옵셋이 존재한다. 이 세그먼트 실렉터는 GDT(전역 디스크립터 테이블)의 인덱스 역할을 하고 GDT 내의 해당 세그먼트 디스크립터에는 디스패치 코드가 존재하는 세그먼트의 베이스 주소가 존재한다. 이 베이스 주소와 인터럽트 게이트의 옵셋을 더해서 디스패치 코드의 주소가 만들어진다.
디스패치 코드는 키보드 디바이스 드라이버의 ISR을 직접 호출하는 것이 아니라 KiInterruptDispatch로 점프한다. KiInterruptDispatch 루틴은 키보드 디바이스 드라이버의 ISR을 호출하는 데 필요한 작업(IRQL을 높이고 인터럽트 스핀락 획득)을 수행한 다음에 키보드 드라이버의 ISR을 호출한다. ISR은 DIRQL에서 호출되므로 극히 제한적인 시스템 서비스 함수를 호출할 수 있다. DIRQL 레벨에서 할 수 없는 추가적인 작업이 필요한 경우 ISR은 DPC 메커니즘을 사용하여 작업을 계속 진행하도록 IoRequestDPC DDK 함수를 호출한다. 이로써 인터럽트는 서비스가 된 것이며 추가적인 작업은 이후에 DPC 콜백이 호출될 때 계속 진행된다.
- khealin님의 블로그에서 -
자 도움이 되었으면 좋겠네요 ^^
스핀록의 획득과 해제는 실행부의 구성 요소인 마이크로커널이 담당한다고 하네요 ^^
또한 드라이버 디스패치 루틴에서 인터럽트 스핀록을 얻고자 할때는 KeSynchronizeExecution()함수
를 사용한다. 이 함수는 특정 인터럽트 오브젝트 대해 인터럽트 서비스 루틴을 가지고 있는 드라이버
루틴과 동기화를 구현할 목적으로 사용되며, 드라이버가 제공한 함수 포인터를 가지고 있다고 하네요
운영체제는 이 함수 호출에 제공된 인터럽트 오브젝트가 가리키는 대로 IRQL을 상승시키고
스핀록을 얻은후, 드라이버가 제공한 함수를 호출한다고 하네요 ^^
'Soft Ware > Windows 구조와 원리' 카테고리의 다른 글
비동기 프로시저 콜 < APC > 에 대해서 ~~ (0) | 2012.02.19 |
---|---|
캐시 인터페이스 (0) | 2012.01.04 |
지연 쓰기 란 (0) | 2012.01.04 |
캐시 관리자 (0) | 2012.01.04 |
스레드 (0) | 2011.11.16 |