의문?

자아.. 우리.. 가 아니라 내가 풀어야할 질문이 몇개가 생겼다.
ISR이랑 DPC랑 DIRQL이랑, PASSIVE레벨이 먼 관계가 있냐.
스핀락이랑 IRQL이 먼 관계냐. 스핀락을 왜 쓰냐. 딴거 쓰면 안대냐. 어케 동작하냐.
각 레벨(DISPATCH, PASSIVE등)에서 동작하는것들은 왜 해당 레벨에서 동작하냐.
DPC랑 APC랑 이놈들이 먼 놈들이냐? 어케 동작하냐? 먼 차이냐- _-
도라이바에서 동기적이라는게 뭐고, 비 동기적 이라는게 뭐냐


::ISR이랑 IDT가 관련이 있는놈이냐 없는놈이냐- _-
이색퀴부터 까 부시고 시작하자.. 후아.. 그니까 말이야. 가정을 해 보자고...
내가 드라이버를 만들었어. 글고 그 드라이버에 인터럽트 루틴을 등록했단 말이야- _-
그러면 IDT에 내 인터럽트 객체가 등록될까? 등록 안되면 암 상관 없는거고, 등록이 되면
상관이 있는거겠지? 글치- _-? 궈궈.. 달려봐..

크흥.. 내가 소프트웨어 인터럽트를 만드는 법을 몰라서.. 남의 소스 가져와서 컴파일한 결과를 알리줄께..

대충 요런 코드가 있삼-0-
vector = HalGetInterruptVector(
    Isa,        //IN INTERFACE_TYPE  InterfaceType,
    0,            //IN ULONG  BusNumber,
    0x6,        //IN ULONG  BusInterruptLevel,
    0x6,        //IN ULONG  BusInterruptVector,
    &Irql,
    &Affinity);
ntStatus = IoConnectInterrupt(
    &pdx->InterruptObject,
    (PKSERVICE_ROUTINE) OnInterruptRoutine,
    (PVOID) pdx,
    NULL,
    vector,                // vector
    (KIRQL) Irql,        // irql
    (KIRQL) Irql,        // irql
    Latched,            //LevelSensitive, //Latched, // Mode,
    TRUE,                // irqshare
    Affinity,            // affinity,
    FALSE                // floating save
    );

요게 인터럽트를 등록하는 루틴인데.. 뭐 어쨌든.. 중요한건 인터럽트 루틴이 'OnInterruptRoutine'이라는거얌.
아, 참고로 드라이버 이름은 DgIntPro야.

에.. 그래서 이 드라이버를 올리고, WinDbg에서 !idt로 확인해 본 결과를 적어줄께.. 잘봐.
....
33: 81c3a1cc (Vector:33,Irql:18,SyncIrql:18,Connected:TRUE, No:0,ShareVector:TRUE,Mode:LevelSensitive,ISR:USBPORT!USBPORT_InterruptService(f82bebca))
34: 81cbd99c (Vector:34,Irql:17,SyncIrql:17,Connected:TRUE, No:0,ShareVector:FALSE,Mode:Latched,ISR:serial!SerialCIsrSw(f86f7a30))
35: 81cb9c7c (Vector:35,Irql:16,SyncIrql:16,Connected:TRUE, No:0,ShareVector:TRUE,Mode:LevelSensitive,ISR:portcls!CKsShellRequestor:: `vector deleting destructor'+0x26(ba452624))
36: 8196a4f4 (Vector:36,Irql:15,SyncIrql:15,Connected:TRUE, No:0,ShareVector:TRUE,Mode:Latched, ISR:DgIntPro!OnInterruptRoutine(f8b45610))
37: 804dfd36 (nt!KiUnexpectedInterrupt7)
38: 806eeef0 (hal!HalpProfileInterrupt)
....
이야.. 이게 뭐냐고? 웅.. 잠만.. 내가 중요한것만 뵈 줄께..
36: 8196a4f4 .... ISR:DgIntPro!OnInterruptRoutine(f8b45610))
.. 이제 뵈지? 그니까 우리가 등록한 인터럽트는 IDT에 등록이 되는거얌. 그리고 실제 인터럽트가 발생하면, IDT를 보고, 실제 인터럽트를 실행하게 되는거지.
하여간 대충 이런식의 관계가 있다고 보면 될거 같암 : )


스핀락 예제 작성 워워-0-~



...
PS. 내가 아래에 적었던 내용중 반 정도는 이해를 못하고 적은듯 하다. 오늘 정리하면서 보니까.. 뭔 헛소리를 저리 써 놨는지..- _;

나중에 다시 정리해야 할텐데.. 걍 PPT만 올릴까나..- _;

덧글

  • WERT 2008/01/07 17:26 # 답글

    우와.. 공부 진짜 열심히 하시네요.. 전 요새 완전 놀고있는데..
    자극 많이받고 가네요 -_-)b..
    저도 승네횽처럼 공부하고 싶은데 빌드오더좀 가르쳐주세요. 하하.
댓글 입력 영역