Перехват аппаратного прерывания

Тема в разделе "WASM.ELECTRONICS", создана пользователем netex, 7 мар 2006.

  1. netex

    netex New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    114
    Адрес:
    Russia
    Нужен ваш совет. Немного поясню задачу. Хочу сделать обработчик физического прерывания.

    Сделать его не зависимым от Windows, т.е. пришло прерывание, процессор перешел по IDT, и никакие IRQL не мешали.

    Обработчик не на уровне ОС, а на уровне "железа" и работы процессора.

    Вот примерный план действий:

    В однопроцессорной системе делаем обработчик прерывания.

    Изменяем соответствующий вектор в IDT.(изменяем адрес обработчика, тип - шлюз прерывания)

    В обработчике НЕ разрешаем прерывания.(sti сделаем при выходе)

    Значит ли это, что система не сможет получить управление до команды sti? (т.е. Windows переключить задачу)

    В случае аппаратного прерывания в APIC будут ли маскироваться прерывания с меньшим(таким же) приоритетом, что и текущее, которое мы обрабатываем?(в i8259A маскируются и после обработки нужно послать 20h в порт 20h)

    Можно ли вызывать из такого обработчика (с запрещенными прерываниями) вызывать функции ОС (например: поместить DPC в очередь или RaiseIRQL)?

    Если у вас есть другие идеи, расскажите о них, буду только благодарен.
     
  2. eugene_

    eugene_ New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2005
    Сообщения:
    93
    Адрес:
    Russia
    RaiseIRQL - зачем? (ибо итак IRQL_HIGH если CLI вызвал)

    Переключение задач произойдет когда IRQL будет < IRQL_DISPATCH
     
  3. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Я присоединяюсь к вопросам заданным в этой теме:)

    Самое интересное среди них для меня - вопрос по поводу "нужно послать 20h в порт 20h". Ведь обычные PIC-и могут инициализироваться разным образом. Например, есть такой режим, когда не нужно ничего посылать в порт 20h по окончании обработки. Так вот инетересно, как именно Винда инициализирует контроллер?
     
  4. netex

    netex New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    114
    Адрес:
    Russia
    Уже несколько дней погряз в книге жизни ("IA-32 Intel Architecture Software Developer’s Manual").

    Вот что удалось нарыть по теме.

    1. Кол-во процессоров (в случае разных физических корпусов) через APIC определить нельзя.



    "At the end of the boot-strap procedure, the BSP sets a processor counter to 1, then

    broadcasts a SIPI message to all the APs in the system. Here, the SIPI message contains a

    vector to the BIOS AP initialization code (at 000VV000H, where VV is the vector

    contained in the SIPI message).



    The first action of the AP initialization code is to set up a race (among the APs) to a BIOS

    initialization semaphore. The first AP to the semaphore begins executing the initialization

    code. (See Section 7.5.4, “MP Initialization Example”, for semaphore implementation

    details.) As part of the AP initialization procedure, the AP adds its APIC ID number to the

    ACPI and MP tables as appropriate and increments the processor counter by 1. At the

    completion of the initialization procedure, the AP executes a CLI instruction and halts

    itself."

    Используется общая переменная в которую каждый процессор (логический) прибавляет 1.

    С запуском SIPI проблема, так как процедура должна быть в младших адресах, а следовательно page в win.

    (at 000VV000H, where VV is the vector contained in the SIPI message)



    2. Если процессор двухядерный или/и с HT, то количество логических процессоров определяется с помощью

    CPUID eax=1 ebx[23,16]



    3.Отличный способ заставить конкретный процессор сделать что-либо это послать ему IPI.

    (Сhapter 8, 8.6 ISSUING INTERPROCESSOR INTERRUPTS)

    Применительно для задачи перезаписи вектора в IDT на всех процессорах, это не подойдет.

    В IPI указывается вектор прерывания по которому должен перейти процессор (получивший IPI).

    Вот этот самый вектор будет транслироваться в адрес процедуры используя IDT процессора получившего IPI.

    А адрес мы не знаем, так что подменить процедурку не сможем.

    Я пологаю Win использует эту технику для работы на нескольких процессорах, ОС заранее знает какой вектор

    послать в IPI, так как сама составляет IDT.



    4. После обработки аппаратного прерывания нужно записать 0 по адресу 0FEE0 00B0H,

    это сбросит флаг обработки прерывания в APIC и разрешит обработку прерываний с более низкими приоритетами.

    Наподобее i8259A значение 20h в порт 20h. (Chapter 8, 8.8.5 Signaling Interrupt Servicing Completion)

    (адрес 0FEE0 00B0H условный, по умолчанию базовый адрес APIC FEE00000H,

    но он может быть изменен. Правильно определять базу APIC из IA32_APIC_BASE MSR(1Bh) )

    (Chapter 8, 8.4.4 Local APIC Status and Location)





    НЕПОНЯТКИ:

    В случае SMP архитектуры зачем ОС (win) задает разные IDT для разных процессоров?

    Если бы все использовали одну IDT, то достаточно было бы изменить в ней вектор и все работало.

    IRQ транслируются на вектора в таком порядке irq0 - 32 irq1 - 33 ...? (т.е. на начало свободных прерываний)

    Эта трансляция жестко задана или можно сделать irq0 - 40?

    (в Intel manual'е я этого не нашел)



    P.S. Жители Москвы и Моск.обл. не желаете ли сходить на семинар INTEL? (см. www.softline.ru раздел "семинары" 23 марта)

    Я записался...