Нужен ваш совет. Немного поясню задачу. Хочу сделать обработчик физического прерывания. Сделать его не зависимым от Windows, т.е. пришло прерывание, процессор перешел по IDT, и никакие IRQL не мешали. Обработчик не на уровне ОС, а на уровне "железа" и работы процессора. Вот примерный план действий: В однопроцессорной системе делаем обработчик прерывания. Изменяем соответствующий вектор в IDT.(изменяем адрес обработчика, тип - шлюз прерывания) В обработчике НЕ разрешаем прерывания.(sti сделаем при выходе) Значит ли это, что система не сможет получить управление до команды sti? (т.е. Windows переключить задачу) В случае аппаратного прерывания в APIC будут ли маскироваться прерывания с меньшим(таким же) приоритетом, что и текущее, которое мы обрабатываем?(в i8259A маскируются и после обработки нужно послать 20h в порт 20h) Можно ли вызывать из такого обработчика (с запрещенными прерываниями) вызывать функции ОС (например: поместить DPC в очередь или RaiseIRQL)? Если у вас есть другие идеи, расскажите о них, буду только благодарен.
RaiseIRQL - зачем? (ибо итак IRQL_HIGH если CLI вызвал) Переключение задач произойдет когда IRQL будет < IRQL_DISPATCH
Я присоединяюсь к вопросам заданным в этой теме Самое интересное среди них для меня - вопрос по поводу "нужно послать 20h в порт 20h". Ведь обычные PIC-и могут инициализироваться разным образом. Например, есть такой режим, когда не нужно ничего посылать в порт 20h по окончании обработки. Так вот инетересно, как именно Винда инициализирует контроллер?
Уже несколько дней погряз в книге жизни ("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 марта) Я записался...