Не работает.
Код:
; Включим и настроим Local APIC
mov eax, [local_apic_registers + 0xF0]
or eax, 0x100
mov al, IRQ_BASE ; Вместо прерывания PIC, которое я замаскирую, будет "неопределённое"
mov [local_apic_registers + 0xF0], eax
mov eax, [local_apic_registers + 0x350]
and eax, 0xFFFE58FF
mov [local_apic_registers + 0x350], eax
mov eax, [local_apic_registers + 0x360]
and eax, 0xFFFE58FF
or eax, 0x400
mov [local_apic_registers + 0x360], eax
mov al, 0x70
out 0x22, al
mov al, 1
out 0x23, al
; Примонтируем регистры IO APIC к адресному пространству
mov rax, 0xFEC00000 + 10011b
mov rdx, io_apic_registers
mov rbx, cr3
mov rcx, 1
call map_virtual_pages
; Замаскируем прерывание от PIC
mov dword[io_apic_registers + 0x00], 0x10
mov dword[io_apic_registers + 0x10], 0x10000
mov dword[io_apic_registers + 0x00], 0x11
mov dword[io_apic_registers + 0x10], 0
; Переадресуем остальные прерывания ISA
mov rcx, 15
mov edx, IRQ_BASE + 1
mov ebx, 0x12
@@:
mov [io_apic_registers + 0x00], ebx
mov [io_apic_registers + 0x10], edx
inc ebx
mov [io_apic_registers + 0x00], ebx
mov dword[io_apic_registers + 0x10], 0
inc ebx
inc edx
loop @b
; Переадресуем прерывания PCI
mov rcx, 8
or edx, 0xA000
@@:
mov [io_apic_registers + 0x00], ebx
mov [io_apic_registers + 0x10], edx
inc ebx
mov [io_apic_registers + 0x00], ebx
mov dword[io_apic_registers + 0x10], 0
inc ebx
inc edx
loop @b
Пустой обработчик прерывания выглядит так:
Код:
empty_irq_handler:
mov dword[local_apic_registers + 0xB0], 0
iretq
А ещё у меня обработчик таймерного прерывания выполняет переключение задач. Я потом ставлю его на IRQ2. Ну так вот. Обработчик IRQ2 ни разу не вызывается. Однако два раза вызывается пустой обработчик (а потом вообще обработчики прерываний не вызываются. Например, я нажимаю на клавишу клавиатуры - должен вызваться пустой обработчик, но этого не происходит). Что я сделал не так? Проверял с помощью Bochs. Там можно в отладчике включить останов по xchg bx, bx. Я поставил в начале обработчиков эту команду. Останов как я уже сказал выше происходит два раза на пустом обработчике и больше никогда не происходит. При этом флаг IF установлен.