Медетировал над "IntelR 64 and IA-32 Architectures Software Developer_s Manual Volume 3B: System Programming Guide, Part 2.2007,May" но проблему так и не решил. Итак,у меня 2(4)-х ядерный процессор.У каждого ядра свой блок регистров. Иными словами есть 2 независимых набора отладочных р-ров DR0-DR7. Есть драйвер,который ставит X (eXec) брякпоинт в нижние 2G те в память приложений. При выполнении условия срабатывает бряк,драйвер меняет EIP процесса пользователя,инициализирует бряк снова и передает управление обратно.Все работает. В настоящий момент я использую одно ядро.Те бряк ловит только один процессор.Если процесс в этот момент выполняется на другом ядре,я иду лесом. В поисках ответа ковыряю DS3.2,но это надолго. Вопрос.Как можно захомутать 2 ядра сразу? Если нельзя переключить активный процессор,как добраться до его DR'ов? Какие здесь ньюансы? И можно ли гденить почитать про это?
С двумя ядрами не работал, но пришел в голову такой вариант: если попробовать процедуру установки запустить в двух потоках, выполняющихся на двух ядрах (с помощью SetThreadAffinity* ф-ий). Тогда, по идее, будут задействованы DRx регистры обоих ядер.
IPI (Inter-Processor Interrupts) Код (Text): change_dbx_registers: ... align 4 function_address: dd 0 ipi_handler: call dword [function_address] iretd db_handler: ... push eax mov dword [function_address], change_dbx_registers mov dword [0xFEE00300], 0x84000 OR IPI_VECTOR ...
Mika0x65 Точнее KeSetAffinityThread? Не то.. n0name Интересный у товарища способ Попробую.. rei3er Откуда этот код,чему равен IPI_VECTOR и что будет после mov dword [0xFEE00300], 0x84000 OR IPI_VECTOR ? Понятно,что это команда для APIC в ICR,но смысл ускользает.
TheDeath IPI_VECTOR это номер вектора прерывания, обработчик которого ipi_handler. Ты сам его задаешь, предварительно конечно записав в таблицу векторов. После выполнения записи в ICR как правило отсылается IPI. 0x84000 это значит, что Level = Assert, DestMode = Phys, DeliveryStatus = Idle, TriggerMode = Edge, DeliveryMode = Fixed, Dest = All with Self.
n0name Что такое 0x84000 я и так понял. Не понял только,что произойдет после записи в ICR.Когда произойдет переключение процессора? Прерывание будет обрабатывать уже другое ядро или как? А если у меня их 4? Прерывание сработает 4 раза? Чувствую,что теряюсь.Поэтому чтобы не парить мозги себе и окружающим,спрошу. Где можно надыбать документацию на APIC и работу в многопроцессорной среде? intel.com?
сгенерируется IPI. APIC-контроллер, конкретно для этого значения, вызовет вектор прерывания для каждого логического процессора. Код у rei3er не полон, нет занесения вектора прерывания в таблицу. Я читал следующие доки: 276613_276613.pdf, 253668.pdf, 24201606.pdf. Все от Intel. AMD что-то тоже выпускает, но мне не нравятся они
у тебя Volume 3B читай Volume 3A (разделы 7-8) с intel.com можешь скачать MP-спецификацию Local APIC процессора, который инициировал запись в ICR, генерирует специальный тип транзакции (IPI) на системной шине, в результате которой каждый Local APIC на ней получает 32-ух битное сообщение (это сообщение в данном случае имеет вид 0x840xx) т. к Delivery Mode у нас Fixed, то, получив сообщение, каждый Local APIC начинает стандартный INTR-INTA цикл с соответствующим ему процессором, после получения от CPU сигнала INTA, на шину данных кладется номер вектора прерывания из IDT (xx), процессор его читает, определяет дескриптор в IDT и т. д
TheDeath <Вопрос.Как можно захомутать 2 ядра сразу? Если нельзя переключить активный процессор,как добраться до его DR'ов? Какие здесь ньюансы? И можно ли гденить почитать про это?> вообще то ds32 работает нормально с бряками. Бряка возникает только тогда, когда поток, принадлежащий данному процессору наезжает на адрес, который прописан именно в регистрах данного процессора. Но студия32 ставит бряки в обоих ядрах. У меня небыло таких проблем как ты пишешь. А если тебе надо замутить чтоб самому бряки ставить. ну так, напиши дравину, в ней создай системные потоки и раскидай их по разным ядрам. а дальше сможешь уже работать с ядрами.
k3internal Проблема здесь еще и в том,что я отлаживаю драйвер под айсом.С IPI разобрался.Если использую для синхронизации левое int,скажем 99,все вработет.Попытки захомутать NMI пока неудаются: 1. В XP NMI это TSS 2. NMI использует айс,точнее CptHook. Есть момент,который я не догоняю.Чтобы за'hook'ать прервание,дескриптор которого TSS а не шлюз,достаточно подправить EIP в TSS или нужно создавать свой TSS и в конце передовать управление в старую задачу?
и так, и так можно но, имхо, лучше первый вариант во-втором случае, чтобы передать управление оригинальной задаче, нужно изменить дескриптор в GDT, который уже был изменен при установке хука как вариант, можно найти свободный дескриптор в GDT и скопировать содержимое нужного нам для хука дескриптора в этот найденный. Далее изменяем по своему усмотрению хукаемый дескриптор, при возникновении прерывания, выполняем свои действия и в конце делаем far call или jmp на новый дескриптор (шлюз TSS или TSS)