Драйвер,2 ядра и отладочные регистры.

Тема в разделе "WASM.NT.KERNEL", создана пользователем TheDeath, 3 июл 2007.

  1. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    Медетировал над "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'ов? Какие здесь ньюансы? И можно ли гденить почитать про это?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    С двумя ядрами не работал, но пришел в голову такой вариант: если попробовать процедуру установки запустить в двух потоках, выполняющихся на двух ядрах (с помощью SetThreadAffinity* ф-ий). Тогда, по идее, будут задействованы DRx регистры обоих ядер.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    http://chpie.org/blog/attachment/1018884275.zip
     
  4. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    IPI (Inter-Processor Interrupts)
    Код (Text):
    1. change_dbx_registers:
    2.     ...
    3.  
    4. align 4
    5. function_address:
    6.     dd 0
    7.  
    8. ipi_handler:
    9.     call dword [function_address]
    10.     iretd
    11.  
    12. db_handler:
    13.     ...
    14.     push eax
    15.     mov dword [function_address], change_dbx_registers
    16.     mov dword [0xFEE00300], 0x84000 OR IPI_VECTOR
    17.     ...
     
  5. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    Mika0x65
    Точнее KeSetAffinityThread? Не то..

    n0name
    Интересный у товарища способ :) Попробую..

    rei3er
    Откуда этот код,чему равен IPI_VECTOR и что будет после mov dword [0xFEE00300], 0x84000 OR IPI_VECTOR ? Понятно,что это команда для APIC в ICR,но смысл ускользает.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    TheDeath
    IPI_VECTOR это номер вектора прерывания, обработчик которого ipi_handler.
    Ты сам его задаешь, предварительно конечно записав в таблицу векторов.

    После выполнения записи в ICR как правило отсылается IPI.

    0x84000 это значит, что Level = Assert, DestMode = Phys, DeliveryStatus = Idle, TriggerMode = Edge, DeliveryMode = Fixed, Dest = All with Self.
     
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    исправлено
    работать надо через переменную, а не через регистр
     
  8. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    n0name
    Что такое 0x84000 я и так понял. Не понял только,что произойдет после записи в ICR.Когда произойдет переключение процессора? Прерывание будет обрабатывать уже другое ядро или как? А если у меня их 4? Прерывание сработает 4 раза?
    Чувствую,что теряюсь.Поэтому чтобы не парить мозги себе и окружающим,спрошу.
    Где можно надыбать документацию на APIC и работу в многопроцессорной среде? intel.com?
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    сгенерируется IPI. APIC-контроллер, конкретно для этого значения, вызовет вектор прерывания для каждого логического процессора. Код у rei3er не полон, нет занесения вектора прерывания в таблицу.
    Я читал следующие доки: 276613_276613.pdf, 253668.pdf, 24201606.pdf. Все от Intel. AMD что-то тоже выпускает, но мне не нравятся они ;)
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Не хочешь парится с APIC проще воспользоватся средствами ОСи, как в том сорце.
     
  11. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    у тебя 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 и т. д
     
  12. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    Ага,кажется начинаю понимать.
    Номер прерывания может быть любым или все же 2 [NMI]?
     
  13. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    если Delivery Mode = Fixed или Lowest Priority, то любым
     
  14. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    TheDeath
    <Вопрос.Как можно захомутать 2 ядра сразу? Если нельзя переключить активный процессор,как добраться до его DR'ов? Какие здесь ньюансы? И можно ли гденить почитать про это?>

    вообще то ds32 работает нормально с бряками. Бряка возникает только тогда, когда поток, принадлежащий данному процессору наезжает на адрес, который прописан именно в регистрах данного процессора. Но студия32 ставит бряки в обоих ядрах. У меня небыло таких проблем как ты пишешь. А если тебе надо замутить чтоб самому бряки ставить. ну так, напиши дравину, в ней создай системные потоки и раскидай их по разным ядрам. а дальше сможешь уже работать с ядрами.
     
  15. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    Это тоже выход.
     
  16. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    k3internal
    Проблема здесь еще и в том,что я отлаживаю драйвер под айсом.С IPI разобрался.Если использую для синхронизации левое int,скажем 99,все вработет.Попытки захомутать NMI пока неудаются:
    1. В XP NMI это TSS
    2. NMI использует айс,точнее CptHook.
    Есть момент,который я не догоняю.Чтобы за'hook'ать прервание,дескриптор которого TSS а не шлюз,достаточно подправить EIP в TSS или нужно создавать свой TSS и в конце передовать управление в старую задачу?
     
  17. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    и так, и так можно
    но, имхо, лучше первый вариант
    во-втором случае, чтобы передать управление оригинальной задаче, нужно изменить дескриптор в GDT, который уже был изменен при установке хука
    как вариант, можно найти свободный дескриптор в GDT и скопировать содержимое нужного нам для хука дескриптора в этот найденный. Далее изменяем по своему усмотрению хукаемый дескриптор,
    при возникновении прерывания, выполняем свои действия и в конце делаем far call или jmp на новый дескриптор (шлюз TSS или TSS)