Подскажите, пожалуйста, где в сети можно почитать в электронном виде про обработчик первого прерывания в защищенном режиме (что-то на подобие интелловских талдундов)?
талдундов Да, и самое интересное - как внутри обработчика прерывания определить, на каком из процессоров оно сработало. Дело в том, что функция KeGetCurrentProcessorNumber в ХР почему-то отсутствует. Может, это реально сделать через какие-то структуры?
Конечно такой ф-ции нет Это же макрос Код (Text): // Get the current processor number // FORCEINLINE ULONG NTAPI KeGetCurrentProcessorNumber(VOID) { __asm { movzx eax, _PCR KPCR.Number } } В DDK он определен ещё с w2k C:\WINDDK\2600\inc\ddk\w2k\ntddk.h
Не знаю как на AMD, на Intel-ах можно выполнить MOV EAX, 1 CPUID и проанализировать APIC ID (биты 31-24 EBX) в младших битах APIC ID номер логического (для HTT) или физического (для SMP) процессора. В мануалах к процессорам все подробно описано.
SteelRat спасибо! в МСДН об этом не упомянули valinor в том-то и дело, что манов я не смог найти (было бы здорово узнать ссылочку на интелловские доки)
Wolfgang не знаю какой частью тела ты искал, но потратив 2 минуты на сайте интел выходишь вот сюда Код (Text): http://developer.intel.com/design/pentium4/manuals/index_new.htm
За ссылку спасибо (не нашел из-за глюков корпоративного файервола). Подробно прочел, но остались вопросы. Сделал я свой обработчик первого прерывания: <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 сбрасывается! Ан нет! Почему? И почему нужно в обработчике переопределять селекторы сегментов?