Регистрация вектора прерывания в операционной системе

Тема в разделе "WASM.NT.KERNEL", создана пользователем Hunter, 13 сен 2007.

  1. Hunter

    Hunter New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    47
    Добрый день!
    Есть такая проблема: нужно зарегистрировать вектор прерывания для своих нужд. Можно ли это сделать средствами операционной системы без правки вручную таблицы IDT? Если да, то можно ли задавать желаемый номер вектора или он назначается на усмотрение операционки? Интересует для Windows и Linux (ядро 2.6.x). Буду признателен за любую информацию по теме :).
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    мм посмотри описание IoConnectInterrupt.

    IoConnectInterrupt
    The IoConnectInterrupt routine registers a device driver's InterruptService routine (ISR), so that it will be called when a device interrupts on any of a specified set of processors. ...

    (MSDN)

    Но честно признаюсь, не нравится мне она. Я обычно ручками все ставлю в IDT
     
  3. Hunter

    Hunter New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    47
    Да, но в прямой правке IDT есть проблемы. К примеру в 64-битной версии винды есть проверки checksum для критически важных данных. Т.е. если поправить такую табличку как IDT, то можно получить BSOD.
     
  4. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Great

    Я обычно ручками все ставлю в IDT Замечательно, а у тебя процессор одноядерный или 2х ядерный?

    Что касается IoConnectInterrupt то для каких таких "нужно зарегистрировать вектор прерывания для своих нужд" своих нужд. Если разрабатываешь драйвер устройства, то этой функцией пользоваться весма даже нужно, поскольку на одном прерывании может висеть несколько устройств, а если в ручную править IDT, то прерывание будет обрабатываться только твое, а если прерывание генерирует вовсе не твое устройство, то используя IoConnectInterrupt можно вовсе его не дождаться, поскольку оно может быть обработано до твоего кода.
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    у меня 2х. тоже делаю всё ручками.
     
  6. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    n0name

    Тогда поставь IDT на APIC прерывание на одном процессоре, хм.. через несколько секунд-минут получиш весьма интересный скрин... :).
     
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    в смысле?
    регистр IDTR в каждом ядре должен содержать одинаковое значение
    для атомарного изменения элемента IDT можно использовать CMPXCHG16B
     
  8. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    У меня есть и 16х SMP. "Тоже делаю все ручками"(с) Интересных скринов на эту тему давно не наблюдал. :)
     
  9. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    rei3er

    В СМЫСЛЕ? Смысл простой дай комманду CPU без параметров в SoftICE на 2x процессорной машине и посмотри базу IDT, GDT.
     
  10. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    PROFi
    и что будет?
    посмотреть не могу, т. к нет винды и SoftICE в частности
     
  11. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    rei3er


    базы IDT, GDT для каждого процессора (физического) разные.
     
  12. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    PROFi
    т. е у каждого CPU своя копия IDT?
    ну тогда действительно вручную ничего не сделаешь
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    легко можно получить из KPCR. А список KPCR-структур в ядре можно найти динамически.
     
  14. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    это уже не "сделать вручную"
    вручную - это только использование средств CPU без применительно к какой-либо ОС
    с тем же успехом можно тот же IoConnectInterrupt вызвать...
     
  15. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    rei3er, а ты свою собственную ОС пишешь, или под существующими работаешь?
    Вручную, в данном контексте значит "не прибегая к API системы". Поиск KiProcessorBlock, как верно заметил n0name, легко реализуется без API.
    Так в чем проблема?
     
  16. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    это шутка?
    ну, допустим, Linux...и что?
    в разном понимании слова "вручную"
     
  17. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    n0name

    легко можно получить из KPCR Хм.. а они разные на каждой платформе, вот только вопрос: чем же IoConnectInterrupt не устраивает. Она работает и на 32 ядрах. А под Linux тоже есть похожая функция.
     
  18. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    да, request_irq() называется