Обработчик прерывания

Тема в разделе "WASM.WIN32", создана пользователем Wolfgang, 23 июн 2005.

  1. Wolfgang

    Wolfgang New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    82
    Адрес:
    Russia
    Подскажите, пожалуйста, где в сети можно почитать в электронном виде про обработчик первого прерывания в защищенном режиме (что-то на подобие интелловских талдундов)?
     
  2. Wolfgang

    Wolfgang New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    82
    Адрес:
    Russia
    талдундов



    Да, и самое интересное - как внутри обработчика прерывания определить, на каком из процессоров оно сработало. Дело в том, что функция KeGetCurrentProcessorNumber в ХР почему-то отсутствует. Может, это реально сделать через какие-то структуры?
     
  3. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Конечно такой ф-ции нет :) Это же макрос
    Код (Text):
    1. // Get the current processor number
    2. //
    3.  
    4. FORCEINLINE
    5. ULONG
    6. NTAPI
    7. KeGetCurrentProcessorNumber(VOID)
    8. {
    9.     __asm {  movzx eax, _PCR KPCR.Number  }
    10. }


    В DDK он определен ещё с w2k C:\WINDDK\2600\inc\ddk\w2k\ntddk.h
     
  4. valinor

    valinor New Member

    Публикаций:
    0
    Регистрация:
    7 май 2005
    Сообщения:
    27
    Не знаю как на AMD, на Intel-ах можно выполнить

    MOV EAX, 1

    CPUID

    и проанализировать APIC ID (биты 31-24 EBX)

    в младших битах APIC ID номер логического (для HTT) или физического (для SMP) процессора.

    В мануалах к процессорам все подробно описано.
     
  5. Wolfgang

    Wolfgang New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    82
    Адрес:
    Russia
    SteelRat

    спасибо! в МСДН об этом не упомянули :)



    valinor

    в том-то и дело, что манов я не смог найти (было бы здорово узнать ссылочку на интелловские доки)
     
  6. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    Wolfgang

    не знаю какой частью тела ты искал, но потратив 2 минуты на сайте интел выходишь вот сюда
    Код (Text):
    1. http://developer.intel.com/design/pentium4/manuals/index_new.htm
    2.  
     
  7. Wolfgang

    Wolfgang New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    82
    Адрес:
    Russia
    За ссылку спасибо (не нашел из-за глюков корпоративного файервола). Подробно прочел, но остались вопросы. Сделал я свой обработчик первого прерывания:



    <font face="courier]

    BD equ 0010000000000000b

    B0 equ 0001b

    B1 equ 0010b

    B2 equ 0100b

    B3 equ 1000b

    RF equ 10000000000000000b

    GD equ 00000000000000000010000000000000b



    new_h:

    push eax



    push ebp

    mov ebp,esp

    pushad

    pushfd

    push ds

    push es

    push fs

    mov eax,30h

    mov fs, ax

    mov eax,23h

    mov ds,ax

    mov es,ax



    ; тут что-то делаем



    mov eax, dr6

    test eax, BD

    jz int_orig



    mov eax, dr6

    and eax, not BD

    mov dr6, eax



    mov eax, dr7

    or eax, GD

    mov dr7, eax



    call ggg ; некая самописная функция пищания динамиком



    mov eax, [ebp+10h] ; выставляем битик RF в образе EFLAGS в стеке

    or eax, RF

    mov [ebp+10h], eax



    pop fs

    pop es

    pop ds

    popfd

    popad

    pop ebp

    add esp, 4

    iretd



    int_orig:

    lea esi, sta.orig_trap

    assume esi:ptr ttrap

    mov ax, [esi].offs_h

    shl eax, 16

    mov ax, [esi].offs_l

    assume esi:nothing

    mov [ebp+4], eax



    ; mov eax, dr7

    ; or eax, GD

    ; mov dr7, eax



    pop fs

    pop es

    pop ds

    popfd

    popad

    pop ebp

    ret

    </font><!--face-->



    выставил в DR7 13-й бит (прерывание при обращении к отладочному регистру) но при первом же обращении к отладочному регистру происходит зависание (динамик сначала долго многократно пищит, потом ребут). Ведь в обработчике первого прерывания 13-й бит у DR7 сбрасывается! Ан нет! Почему? И почему нужно в обработчике переопределять селекторы сегментов?