Свободный номер прерывания.

Тема в разделе "WASM.NT.KERNEL", создана пользователем Clerk, 29 дек 2008.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Необходимо создать шлюз прерывания для быстрого управления некоторым кодом в ядре, который будет вызываться из юзермода. Нужно сделоть статически(не искать свободный вектор), тоесть всюду номер прерывания должен быть константой. Свободных векторов много, посоветуйте какой использовать. Я решил использовать одино из свободных которое является заглушкой(для которых вектор равен KiTrap0F()). Это 0xF и [0x14%0x1E]. Но это у меня свободны, хотелось бы узнать у когонибудь они используются(разумеется виндоз).
     
  2. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    Можно оффтоп - а почему решил делать именно через прерывание? Просто у меня тоже была такая мысль для драйвера который щас пишу но потом подумал что есть стандартные неплохие способы
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SashaTalakin
    Нужно очень быстро. Варианта только два - вызов через шлюз вызова и через шлюз прерывания, решил делоть через прерывание, это удобнее. Была есчо идея заюзоть исключения(например mov dword ptr ds:[XXXX],XXXX), но решил что это не надёжно.
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Я за callgate.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Partner
    Почему ?
    Для каждого процессора GDT своя, поэтому аналогично как и для создания шлюзов в IDT нужно выполнить код на всех процессорах, ибо я не уверен что в ядре есть таблица содержащая адреса всех GDT.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Partner
    Ты прав, походу буду использовать калгейт. В ядре в секции данных(RVA_5.1.2600.2180 = 0x0048C260 - 0x400000) есть таблица в которой содержаться адреса всех GDT.
    Код (Text):
    1. // KiAbiosGdt[] defines the Starting address of GDT for each processor.
    2. //
    3. ULONG KiAbiosGdt[MAXIMUM_PROCESSORS]
    Проверил всё верно, у меня два ядра, там два адреса теже что и в gdtr обоих процессоров.
    Тока не экспортируется, но найти проще(ссылка в KeI386AllocateGdtSelectors) чем KeIpiGenericCall(), но необходимо синхронно с остальными процессорами модифицировать эти таблицы, тоесть на время их модификации нужно остальные процессоры остановить что нужно сделоть посредством IPI, а нужный функционал ядром не экспортируется(я делол через поиск KeIpiGenericCall() как и для установки шлюзов во всех IDT, Грит реализовал вручную программированием APIC). Не знаю даже как быть..
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Хотя нет, атомарно не нужно. Просто буду проверять атомарно(lock) флажок в хэндлере и всё. Спасибо, реализую через калгейт.
     
  8. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    1. Не нужно искать свободный вектор
    2. Аппаратная поддержка перегрузки параметров (word count в дескрипторе)
    3. Не проверял, но говорят call gate быстрее.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Partner
    1. Искать нужно, хотя есть переменная в которой определён последний занятый селектор, но думою если взять с конца таблицы то это не важно.
    2. Не актуально, параметры передаются через регистры.
    3. Врятле.
     
  10. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    А зачем заморачиваться с колгейтами и прерываниями? Почему бы не воспользоваться
    sysenter?
     
  11. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Научи как.
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Medstrax
    Потомучто Sysenter чтоб заюзоть это нужно перехватывоть чтолибо, дескриптор в сст не подходит делоть ибо медленно.
    Щас ктото скажет мср перезагрузить.. нее, я уже почти кодес с GDT закончил.
     
  13. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    перезагрузите мср :)
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    x0man
    :))
    Примерно так, работает отлично.