Код (Text): int_acc = acc_present or acc_int_gate trap_acc = acc_present or acc_trap_gate Код (Text): acc_present = 10000000b acc_int_gate = 00000110b acc_trap_gate = 00000111b
мм, а ты как работаешь с этими каналами? насколько я понимаю наиболее правильный вариант это поиск контроллера на PCI шине, и уже через него запрашивать каналы.
Я уже добился того что при разрешение прерывание ребут не идет (irq на нужные прерывание), но почему то – дальше что-то не работает… сделал на обработчик таймера (irq0) выводился символ на экран – не работает (а если просто запустить этот обработчик – выводит)… почему так?
JAPH Кажется я всё верно сделал – но всё же, я поприбивал сделать как ты говоришь – как было так и осталось
Попробуй: Код (Text): acc_int_gate = 00001110b acc_trap_gate = 00001111b +, насколько я помню, ловушками (trap) являются только int 0x1 & int 0x3, остальные -- fault, им нужен acc_int_gate.
Код (Text): format MZ heap 0 stack 0x800 entry _code:start include '..\include\pmode.inc' code_descr = (code_desc-null_desc) data_descr = (data_desc-null_desc) video_descr = (video_desc-null_desc) segment _code use16 start: mov ax, _gdt mov ds, ax mov ax, 0x03 int 0x10 cli in al, 0x70 or al, 0x80 out 0x70, al in al, 0x92 or al, 0x02 out 0x92, al xor eax, eax mov ax, pmode shl eax, 0x04 add eax, pm_entry mov [code_desc.base_l], ax rol eax, 0x10 mov [code_desc.base_m], al xor eax, eax mov ax, _data shl eax, 0x04 mov [data_desc.base_l], ax rol eax, 0x10 mov [data_desc.base_m], al xor eax, eax mov ax, ss shl eax, 0x04 mov [stack_desc.base_l], ax rol eax, 0x10 mov [stack_desc.base_m], al xor eax, eax mov ax, _gdt shl eax, 0x04 mov [gdtr+0x02], eax xor eax, eax mov ax, _idt shl eax, 0x04 mov [idtr+0x02], eax lgdt fword [gdtr] lidt fword [idtr] mov eax, cr0 or al, 1 mov cr0, eax jmp fword code_descr:pm_entry segment pmode use32 pm_entry: mov ax, data_descr mov ds, ax mov ax, video_descr mov es, ax mov dx, 0x20 mov ah, 0x20 call set_int_ctrlr mov dx, 0xa0 mov ah, 0x28 call set_int_ctrlr in al, 0x70 and al, 0x7f out 0x70, al sti jmp $ set_int_ctrlr: mov al, 11 out dx, al jmp SHORT $+2 mov al, ah inc dx out dx, al jmp SHORT $+2 mov al, 4 out dx, al jmp SHORT $+2 mov al, 1 out dx, al jmp SHORT $+2 mov al, 0xff out dx, al dec dx ret int30h_handler: pushad cli _puts: lodsb mov edi, [cursor] mov [es:edi*2], al inc [cursor] test al, al jnz _puts sti popad ret exGP_handler: pop eax mov esi, gp call int30h_handler iretd timer_handler: cli inc byte [es:0x00] push ax mov al, 0x20 out 0x20, al pop ax sti iret key_bd: push ecx push ax mov al, 0xed out 0x60, al mov ecx, 0x2000 delay: loop delay mov al, 0x04 out 0x60, al mov al, 0x20 out 0x20, al pop ax pop ecx iret dummy: iret dummy1: push ax mov al, 0x20 out 0x20, al pop ax iret dummy2: push ax mov al, 0x20 out 0x20, al out 0xa0, al pop ax iret code_size = ($-pm_entry) segment _data use32 gp db '*** General Protection Fault ***', 0x00 msg db 'PMODE', 0x00 cursor dd 0x05 data_size = ($-gp) segment _gdt use16 gdt: null_desc desc_struc 0,0,0,0,0,0 code_desc desc_struc code_size-1,0,0,code_acc,0xc0,0 data_desc desc_struc data_size-1,0,0,data_acc,0xc0,0 stack_desc desc_struc 0x800-1,0,0,data_acc,0xc0,0 video_desc desc_struc 0x4000-1,0x8000,0x0b,data_acc,0xc0,0 gdt_size = ($-gdt) gdtr: dw gdt_size-1 dd 0 segment _idt use16 idt: exeption_01 idt_struc dummy,code_descr,0,trap_acc,0 exeption_02 idt_struc dummy,code_descr,0,trap_acc,0 exeption_03 idt_struc dummy,code_descr,0,trap_acc,0 exeption_04 idt_struc dummy,code_descr,0,trap_acc,0 exeption_05 idt_struc dummy,code_descr,0,trap_acc,0 exeption_06 idt_struc dummy,code_descr,0,trap_acc,0 exeption_07 idt_struc dummy,code_descr,0,trap_acc,0 exeption_08 idt_struc dummy,code_descr,0,trap_acc,0 exeption_09 idt_struc dummy,code_descr,0,trap_acc,0 exeption_0a idt_struc dummy,code_descr,0,trap_acc,0 exeption_0b idt_struc dummy,code_descr,0,trap_acc,0 exeption_0c idt_struc dummy,code_descr,0,trap_acc,0 exeption_0d idt_struc exGP_handler,code_descr,0,trap_acc,0 exeption_0e idt_struc dummy,code_descr,0,trap_acc,0 exeption_0f idt_struc dummy,code_descr,0,trap_acc,0 exeption_10 idt_struc dummy,code_descr,0,trap_acc,0 exeption_11 idt_struc dummy,code_descr,0,trap_acc,0 exeption_12 idt_struc dummy,code_descr,0,trap_acc,0 exeption_13 idt_struc dummy,code_descr,0,trap_acc,0 exeption_14 idt_struc dummy,code_descr,0,trap_acc,0 exeption_15 idt_struc dummy,code_descr,0,trap_acc,0 exeption_16 idt_struc dummy,code_descr,0,trap_acc,0 exeption_17 idt_struc dummy,code_descr,0,trap_acc,0 exeption_18 idt_struc dummy,code_descr,0,trap_acc,0 exeption_19 idt_struc dummy,code_descr,0,trap_acc,0 exeption_1a idt_struc dummy,code_descr,0,trap_acc,0 exeption_1b idt_struc dummy,code_descr,0,trap_acc,0 exeption_1c idt_struc dummy,code_descr,0,trap_acc,0 exeption_1d idt_struc dummy,code_descr,0,trap_acc,0 exeption_1e idt_struc dummy,code_descr,0,trap_acc,0 exeption_1f idt_struc dummy,code_descr,0,trap_acc,0 irq_00 idt_struc timer_handler,code_descr,0,int_acc,0 irq_01 idt_struc key_bd,code_descr,0,int_acc,0 irq_02_07 idt_struc 6 dup dummy1,code_descr,0,int_acc,0 irq_08_15 idt_struc 8 dup dummy2,code_descr,0,int_acc,0 idt_size = ($-idt) idtr: dw idt_size-1 dd 0
я тебе дам :p Код (Text): struc desc_struc op1,op2,op3,op4,op5,op6 { .limit_l dw op1 .base_l dw op2 .base_m db op3 .access db op4 .lim_h_f db op5 .base_h db op6 } struc idt_struc op1,op2,op3,op4,op5 { .destoff dw op1 .destsel dw op2 .nparams db op3 .access db op4 .rsrv dw op5 } acc_present = 10000000b acc_cseg = 00011000b acc_dseg = 00010000b acc_expdown = 00000100b acc_conform = 00000100b acc_datawr = 00000010b acc_int_gate = 00000110b acc_trap_gate = 00000111b data_acc = acc_present or acc_dseg or acc_datawr code_acc = acc_present or acc_cseg or acc_conform stack_acc = acc_present or acc_dseg or acc_datawr or acc_expdown idt_acc = acc_present or acc_dseg or acc_datawr int_acc = acc_present or acc_int_gate trap_acc = acc_present or acc_trap_gate
1. Заполнение idtr - запись должна быть в сегмент _idt, а DS указывает на _gdt. 2. 6 dup dummy, делает не то, что вы подразумеваете. Дублируется не весь список, а только dummy => corrupted descriptors. 3. acc_int_gate = 00001110b и acc_trap_gate = 00001111b 4. После перехода в PM проинициализируйте SS. 5. Пределы сегментов из-за гранулярности наверняка не такие, как ожидалось.
Странное программирование 8259А... Код (Text): mov al, 15h out 20h, al out 0A0h, al mov al, 20h ; вектора out 21h, al mov al, 28h out 0A1h, al mov al, 4 ; ведущий out 21h, al; mov al, 2 ; ведомый out 0A1h, al mov al, 0Dh out 21h, al mov al, 9 out 0A1h, al mov al, 0FCh ; разрешаем только IRQ0 и IRQ1 out 21h, al mov al, 0FFh out 0A1h, al В delay задержку лучше побольше. Код (Text): sti @@: hlt jmp @B
JAPH 1. Точно, не заметил, надо idt и gdt перенести в _data и настраивать ds на _data 2. Может бить - переделаю 3. хз, попробую 4. уже сделал 5. хз, что делать?
JAPH ну общем исправление ошибки, я так думаю (может ошибаюсь) - но зачем мне сейчас ставить это исключение? если пока делений на 0 - нету, а в обработчику стоит dummy - простой возврат