Решил заняться изучением защищенного режима, проблема в том, что никак не могу найти толковой информации о перепрограммировании контролера прерываний для изменения базового вектора на 20h Может кто помочь, показать пример кода с комментариями что нужно записывать в порты?
По PIC есть масса информации. Ключевые слова: PIC, 8259. Datasheet брать здесь, или на сайте Интел. Код (Text): ICW1 = 0x11 ;NO LTIM, NO ADI, NO SNGL, ICW4. ICW2_MASTER = 0x20 ;Interrupt vectors base. ICW2_SLAVE = 0x28 ;Interrupt vectors base. ICW3_MASTER = 0x4 ;IRs, where children are connected ICW3_SLAVE = 0x2 ;Child's ID? Not sure about this number... ICW4_MASTER = 0x1 ;NO SFNM, NOT BUFFER, 8086. ICW4_SLAVE = 0x1 ;NO SFNM, NOT BUFFER, 8086. EOI = 0x20 cli mov al, ICW1 out 0x20, al jmp short $ + 2 jmp short $ + 2 mov al, ICW2_MASTER out 21h, al jmp short $ + 2 jmp short $ + 2 mov al, ICW3_MASTER out 0x21, al jmp short $ + 2 jmp short $ + 2 mov al, ICW4_MASTER out 0x21, al jmp short $ + 2 jmp short $ + 2 mov al, ICW1 out 0xA0, al jmp short $ + 2 jmp short $ + 2 mov al, ICW2_SLAVE out 0xA1, al jmp short $ + 2 jmp short $ + 2 mov al, ICW3_SLAVE out 0xA1, al jmp short $ + 2 jmp short $ + 2 mov al, ICW4_SLAVE out 0xA1, al jmp short $ + 2 jmp short $ + 2 sti Комментариев не очень много, но работает. Для первого PIC база равна 0x20, для второго -- 0x28.
1. Считаю, что при сегодняшних технологиях процов подобные вещи: Код (Text): jmp short $ + 2 jmp short $ + 2 являются неким старческим маразмом в программировании железяк, пережиток ОЧЕНЬ далекого прошлого. 2. Поскольку PIC интегрирован в южный мост, а южный мост разрабатывается с УЧЕТОМ ВСЕХ тактовых частот шин и проца, то JMP "погоду не делают" в отношении разноса во временной диаграмме обращений порт-порт. 3. Если уж надо (на сегодня) задержку некую присовокупить (ситуация: на всякий случай-неосознанная глупость), то в таких случаях ставят обращения к "порту холостого хода" OUT 0xEB, AL ;AL - любое, даже Ваше текущее значение годится 4. Короче говоря конкретно по приведенному куску кода выше, то ничто НЕ изменится и НЕнадежней Не станет, если строки с JMP`ами удалить вовсе! 5. Это не критика, я ЗА понимание каждой строчки её назначения и как она работатет
Спасибо за помощь! А первоначально смысл задержки заключался в чем? Контроллер работал медленнее проца, следовательно мог не успеть отреагировать на команду инициализации, так?
>> ICW3_MASTER = 0x4 ;IRs, where children are connected Битовая маска, единицами отмечены пины, к которым присоеденены дети. >> ICW3_SLAVE = 0x2 ;Child's ID? Not sure about this number... Номер пина, к которому присоединён ребёнок, совпадает с ID
Вот еще одна проблемка возникла, написал программку для обработки прерывания таймера - выводит в видеопамять символ при получении прерывания. Под эмулятором все работает (использую Bochs), а при загрузке с первого сектора дискеты - комп сразу же перезагружается. При этом пробовал запретить прерывания, записать строку в видеопамять, выполнить команду hlt, а затем зациклить процессор - jmp $ - в этом случае комп не перезагружается. В чем может быть дело?
deathwisher Скорее всего, помимо таймера, происходит какое-то прерывание, которое ты не обрабатываешь.
Вот код, nasm: Код (Text): [BITS 16] [ORG 0x7C00] cli mov ax, cs mov ds, ax mov ss, ax mov ah, 1 mov ch, 0x20 int 0x10 ; ICW1 mov al, 00010001b out 0x20, al ; ICW2 mov al, 0x20 out 0x21, al ; ICW3 mov al, 00000100b out 0x21, al ; ICW4 mov al, 00000001b out 0x21, al ; disable all interrupts, except IRQ0 mov al, 11111110b out 0x21, al ; GDTR lgdt [gdtr] ; turn on A20 in al, 0x92 or al, 2 out 0x92, al ; set PM bit in cr0 mov eax, cr0 or al, 1 mov cr0, eax ; long jump to protected mode jmp 0x8 : _pm [BITS 32] _pm: ; loading data descriptor mov ax, 0x10 mov ds, ax mov ss, ax mov esp, 0x00007b00 lidt [idtr] sti jmp $ irq_timer: pusha mov al, 'a' mov [0xb8000], al mov al, 0x20 out 0x20, al popa iret gdt: dd 0, 0 ; code descriptor db 0xFF db 0xFF db 0x0 db 0x0 db 0x0 db 10011010b db 11001111b db 0x0 ; data descriptor db 0xFF db 0xFF db 0x0 db 0x0 db 0x0 db 10010010b db 11001111b db 0x0 gdtr: dw 2047 dd gdt idt: times 32 dd 0, 0 dw irq_timer db 0x8 db 0x0 db 00000000b db 10001110b db 0x0 db 0x0 idtr: dw 2047 dd idt times 510-($-$$) db 0 db 0xaa, 0x55 На Bochs 2.1.1 работает нормально, записываю в первый сектор дискеты и гружусь с нее - комп перезагружается. Думал что напутал со стеком, но никаких ошибок вроде не нашел.
Привет, спецы по 8259 ,правильно ли я включаю СпэшлМаскинг мод на ПКП ,состоящим из 3х контроллеров, Код (Text): SetSM proc push ax cli [b];3 ПКП - 1 мастер и 2 подчиненых,подключенных к irq6,irq7[/b] [b];програмируем Мастер-контроллер(далее МК)[/b] mov al,10001b ;icw1 (будет icw3,icw4,каскадное подключение) out 20h,al ; mov al,1000b ;icw2(базовый адрес для irq0) out 21h,al ; mov al,11000000b ;icw3(irq6,7 - заняты ведомыми контроллерами) out 21h,al ; mov al,1101b ;icw4 ;Спец.вложенный режим -выключим (если включить - то 11101b) ;буферизир.сист.шин -лучше включить,т.к - ; прим.(на одном сайте написано,что если это сброшено,то следующий бит игнорируется) ;мы - Ведущий-ПКП ;нет режмиа автосброса ISR (конца прерывания) ;тип ЦП 8086 out 21h,al ; ; ;[b]програмируем ведомый ПКП 1:[/b] mov al,10001b ;icw1 (будет icw3,icw4,каскадное подключение) out 0a0h,al ; mov al,10000b ;icw2(базовый адрес) out 0a1h,al ; mov al,110b out 0a1h,al ;icw3(наш ведомый ПКП 1 подключен к 6му irq) ; mov al,1001b out 0a1h,al ;icw4 ;Спец.вложенный режим -выкл,(если вкл - то 1001b) ;буферизир.сист.шин ;мы - Ведомый-ПКП ;нет режмиа автосброса ISR (конца прерывания) ;тип ЦП 8086 ; [b];програмируем ведомый ПКП 2:[/b] mov al,10001b ;icw1 (будет icw3,icw4,каскадное подключение) out 0a0h,al ; mov al,11000b ;icw2(базовый адрес) out 0a1h,al ; mov al,111b ;icw3(наш ведомый ПКП 2 подключен к 7му irq) out 0a1h,al ; mov al,1001b out 0a1h,al ;icw4(аналогично ведомому ПКП 1) ; [b];устанавливаем Режим спец.маскирования[/b] для ведущего и ведомых контроллеров. mov al,1101000b ;ocw3 для ведущего ПКП out 20h,al ;нигде не нашел,нужно ли это делать для ведомого ;но ocw3 распространяетя и на ведомый(порт 0a0h) -поэтому решил включить и в ведомом: mov al,1101000b ;ocw3 для ведомых ПКП out 0a0h,al sti pop ax ret SetSM endp