Добрый день! Есть такая проблема: нужно зарегистрировать вектор прерывания для своих нужд. Можно ли это сделать средствами операционной системы без правки вручную таблицы IDT? Если да, то можно ли задавать желаемый номер вектора или он назначается на усмотрение операционки? Интересует для Windows и Linux (ядро 2.6.x). Буду признателен за любую информацию по теме .
мм посмотри описание 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
Да, но в прямой правке IDT есть проблемы. К примеру в 64-битной версии винды есть проверки checksum для критически важных данных. Т.е. если поправить такую табличку как IDT, то можно получить BSOD.
Great Я обычно ручками все ставлю в IDT Замечательно, а у тебя процессор одноядерный или 2х ядерный? Что касается IoConnectInterrupt то для каких таких "нужно зарегистрировать вектор прерывания для своих нужд" своих нужд. Если разрабатываешь драйвер устройства, то этой функцией пользоваться весма даже нужно, поскольку на одном прерывании может висеть несколько устройств, а если в ручную править IDT, то прерывание будет обрабатываться только твое, а если прерывание генерирует вовсе не твое устройство, то используя IoConnectInterrupt можно вовсе его не дождаться, поскольку оно может быть обработано до твоего кода.
n0name Тогда поставь IDT на APIC прерывание на одном процессоре, хм.. через несколько секунд-минут получиш весьма интересный скрин... .
в смысле? регистр IDTR в каждом ядре должен содержать одинаковое значение для атомарного изменения элемента IDT можно использовать CMPXCHG16B
rei3er В СМЫСЛЕ? Смысл простой дай комманду CPU без параметров в SoftICE на 2x процессорной машине и посмотри базу IDT, GDT.
это уже не "сделать вручную" вручную - это только использование средств CPU без применительно к какой-либо ОС с тем же успехом можно тот же IoConnectInterrupt вызвать...
rei3er, а ты свою собственную ОС пишешь, или под существующими работаешь? Вручную, в данном контексте значит "не прибегая к API системы". Поиск KiProcessorBlock, как верно заметил n0name, легко реализуется без API. Так в чем проблема?
n0name легко можно получить из KPCR Хм.. а они разные на каждой платформе, вот только вопрос: чем же IoConnectInterrupt не устраивает. Она работает и на 32 ядрах. А под Linux тоже есть похожая функция.