Здравствуйте может кто знает, где можно почитать о программировании APIC интересует внешний I/O APIC (описание local APIC есть в мануале от Intel)
Nouzui уже нашел тему новую не хочу создавать, поэтому спрошу здесь если IF = 0, будет ли осуществлена обработка прерывания, которое было сгенерировано Local APIC таймером? ИМХО да, потому как это не внешнее прерывание... но на практике получаю обратное
IF = 0/1 запрещает или разрешает маскируемые прерывания. Вот и получается что таймер запрещается. Да и не только таймер...
есть еще один вопрос ставлю Periodic mode на APIC таймер, однако срабатывает он только один раз т. е выводится на экран только один символ в чем проблема? Код (Text): format binary APIC_TIMER_VECTOR = 0x21 org 7C00h use16 mov ax, 3 int 0x10 lgdt [gdtr] cli in al, 0x70 or al, 0x80 out 0x70, al in al, 0x92 or al, 2 out 0x92, al mov eax, cr0 or eax, 1 OR (1 SHL 30) OR (1 SHL 29) mov cr0, eax db 0x66 db 0xea dd startup_32 dw 1 SHL 3 use32 startup_32: in al, 0x70 and al, 0x7F out 0x70, al mov ecx, 0x1B rdmsr test eax, 1 SHL 11 jnz @F or eax, 1 SHL 11 wrmsr @@: mov ax, 2 SHL 3 mov ds, ax mov ss, ax mov esp, (0x0050 SHL 4) + 0x1000 ; 4Kb stack lidt [idtr] sti mov dword [0xFEE00380], 0x1000 ; set initial count or dword [0xFEE003E0], 0x0A ; set devide mode mov dword [0xFEE00320], APIC_TIMER_VECTOR OR (1 SHL 17) ; set periodic mode @@: hlt jmp @B APIC_timer_handler: mov eax, [flags] mov word [eax], 0x0F30 add eax, 2 cmp eax, 0xB800F jbe @F mov eax, 0xB800 SHL 4 @@: mov [flags], eax mov dword [0xFEE000B0], 0 iretd handler: mov word [0xB800 SHL 4], 0x0F48 iretd flags: dd 0xB800 SHL 4 gdtr: dw GDT_TABLE_SIZE - 1 dd gdt gdt: dq 0x0000000000000000 ; NULL dq 0x00CF98000000FFFF ; 32-bit code dq 0x00CF92000000FFFF ; 32-bit data GDT_TABLE_SIZE = $ - gdt idtr: dw IDT_TABLE_SIZE - 1 dd idt idt: rept 33 { dw handler AND 0x0000FFFF dw 1 SHL 3 db 0 db 0x8E dw (handler AND 0xFFFF0000) SHR 16 } dw APIC_timer_handler AND 0x0000FFFF dw 1 SHL 3 db 0 db 0x8E dw (APIC_timer_handler AND 0xFFFF0000) SHR 16 IDT_TABLE_SIZE = $ - idt
В чём была проблема? EOI не слал? Потому что в Bochs у меня он только один раз срабатывает. В qemu всё ок.
Бошс вообще мегакриво эмулирует некоторые вещи, я бы на него не ориентировался -) Помню мне приходилось патчить сам код эмулятора чтобы работали штуки, которые работают на всех остальных эмуляторах и реальном компе.
Таймер -- внешнее прерывание. Он же не является частью процессора. А всё, что вне процессора -- это внешнее.