Программирование контроллера прерываний

Тема в разделе "WASM.ASSEMBLER", создана пользователем deathwisher, 27 дек 2006.

  1. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    Решил заняться изучением защищенного режима, проблема в том, что никак не могу найти толковой информации о перепрограммировании контролера прерываний для изменения базового вектора на 20h
    Может кто помочь, показать пример кода с комментариями что нужно записывать в порты?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    По PIC есть масса информации. Ключевые слова: PIC, 8259. Datasheet брать здесь, или на сайте Интел.

    Код (Text):
    1. ICW1        = 0x11 ;NO LTIM, NO ADI, NO SNGL, ICW4.
    2. ICW2_MASTER = 0x20 ;Interrupt vectors base.
    3. ICW2_SLAVE  = 0x28 ;Interrupt vectors base.
    4. ICW3_MASTER = 0x4  ;IRs, where children are connected
    5. ICW3_SLAVE  = 0x2  ;Child's ID? Not sure about this number...
    6. ICW4_MASTER = 0x1  ;NO SFNM, NOT BUFFER, 8086.
    7. ICW4_SLAVE  = 0x1  ;NO SFNM, NOT BUFFER, 8086.
    8.  
    9. EOI         = 0x20
    10.  
    11.  cli
    12.  mov     al, ICW1
    13.  out     0x20, al
    14.  jmp     short $ + 2
    15.  jmp     short $ + 2
    16.  mov     al, ICW2_MASTER
    17.  out     21h, al
    18.  jmp     short $ + 2
    19.  jmp     short $ + 2
    20.  mov     al, ICW3_MASTER
    21.  out     0x21, al
    22.  jmp     short $ + 2
    23.  jmp     short $ + 2
    24.  mov     al, ICW4_MASTER
    25.  out     0x21, al
    26.  jmp     short $ + 2
    27.  jmp     short $ + 2
    28.  
    29.  mov     al, ICW1
    30.  out     0xA0, al
    31.  jmp     short $ + 2
    32.  jmp     short $ + 2
    33.  mov     al, ICW2_SLAVE
    34.  out     0xA1, al
    35.  jmp     short $ + 2
    36.  jmp     short $ + 2
    37.  mov     al, ICW3_SLAVE
    38.  out     0xA1, al
    39.  jmp     short $ + 2
    40.  jmp     short $ + 2
    41.  mov     al, ICW4_SLAVE
    42.  out     0xA1, al
    43.  jmp     short $ + 2
    44.  jmp     short $ + 2
    45.  sti
    Комментариев не очень много, но работает. Для первого PIC база равна 0x20, для второго -- 0x28.
     
  3. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    1. Считаю, что при сегодняшних технологиях процов подобные вещи:
    Код (Text):
    1.  jmp     short $ + 2
    2.  jmp     short $ + 2
    являются неким старческим маразмом в программировании железяк, пережиток ОЧЕНЬ далекого прошлого.
    2. Поскольку PIC интегрирован в южный мост, а южный мост разрабатывается с УЧЕТОМ ВСЕХ тактовых частот шин и проца, то JMP "погоду не делают" в отношении разноса во временной диаграмме обращений порт-порт.
    3. Если уж надо (на сегодня) задержку некую присовокупить (ситуация: на всякий случай-неосознанная глупость), то в таких случаях ставят обращения к "порту холостого хода"
    OUT 0xEB, AL ;AL - любое, даже Ваше текущее значение годится :)
    4. Короче говоря конкретно по приведенному куску кода выше, то ничто НЕ изменится и НЕнадежней Не станет, если строки с JMP`ами удалить вовсе!
    5. Это не критика, я ЗА понимание каждой строчки её назначения и как она работатет
     
  4. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    Спасибо за помощь!
    А первоначально смысл задержки заключался в чем? Контроллер работал медленнее проца, следовательно мог не успеть отреагировать на команду инициализации, так?
     
  5. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    >> ICW3_MASTER = 0x4 ;IRs, where children are connected

    Битовая маска, единицами отмечены пины, к которым присоеденены дети.

    >> ICW3_SLAVE = 0x2 ;Child's ID? Not sure about this number...

    Номер пина, к которому присоединён ребёнок, совпадает с ID
     
  6. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    http://sergh.pisem.net/protected/05_external_interrupts.html#IDAZBA1D
     
  7. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    Вот еще одна проблемка возникла, написал программку для обработки прерывания таймера - выводит в видеопамять символ при получении прерывания. Под эмулятором все работает (использую Bochs), а при загрузке с первого сектора дискеты - комп сразу же перезагружается. При этом пробовал запретить прерывания, записать строку в видеопамять, выполнить команду hlt, а затем зациклить процессор - jmp $
    - в этом случае комп не перезагружается.
    В чем может быть дело?
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    sergh, спасибо, стормозил тогда...

    deathwisher, покажи код, а то предположений масса.
     
  9. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    deathwisher
    Скорее всего, помимо таймера, происходит какое-то прерывание, которое ты не обрабатываешь.
     
  10. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    Вот код, nasm:
    Код (Text):
    1. [BITS 16]
    2. [ORG 0x7C00]
    3.  
    4. cli
    5.  
    6. mov ax, cs
    7. mov ds, ax
    8. mov ss, ax
    9.  
    10. mov ah, 1
    11. mov ch, 0x20
    12. int 0x10
    13.  
    14.  
    15. ; ICW1
    16. mov al, 00010001b
    17. out 0x20, al
    18.  
    19. ; ICW2
    20. mov al, 0x20
    21. out 0x21, al
    22.  
    23. ; ICW3
    24. mov al, 00000100b
    25. out 0x21, al
    26.  
    27. ; ICW4
    28. mov al, 00000001b
    29. out 0x21, al
    30.  
    31. ; disable all interrupts, except IRQ0
    32. mov al, 11111110b
    33. out 0x21, al
    34.  
    35.  
    36. ; GDTR
    37. lgdt [gdtr]
    38.  
    39. ; turn on A20
    40. in al, 0x92
    41. or al, 2
    42. out 0x92, al
    43.  
    44. ; set PM bit in cr0
    45. mov eax, cr0
    46. or al, 1
    47. mov cr0, eax
    48.  
    49. ; long jump to protected mode
    50. jmp 0x8 : _pm
    51.  
    52.  
    53. [BITS 32]
    54. _pm:
    55.  
    56. ; loading data descriptor
    57. mov ax, 0x10
    58. mov ds, ax
    59. mov ss, ax
    60. mov esp, 0x00007b00
    61.  
    62.  
    63. lidt [idtr]
    64.  
    65. sti
    66.  
    67. jmp $
    68.  
    69.  
    70. irq_timer:
    71. pusha
    72.  
    73. mov al, 'a'
    74. mov [0xb8000], al
    75.  
    76. mov al, 0x20
    77. out 0x20, al
    78.  
    79. popa
    80.  
    81. iret
    82.  
    83. gdt:
    84. dd 0, 0
    85.  
    86. ; code descriptor
    87. db 0xFF
    88. db 0xFF
    89. db 0x0
    90. db 0x0
    91. db 0x0
    92. db 10011010b
    93. db 11001111b
    94. db 0x0
    95.  
    96. ; data descriptor
    97. db 0xFF
    98. db 0xFF
    99. db 0x0
    100. db 0x0
    101. db 0x0
    102. db 10010010b
    103. db 11001111b
    104. db 0x0
    105.  
    106.  
    107. gdtr:
    108. dw 2047
    109. dd gdt
    110.  
    111. idt:
    112. times 32 dd 0, 0
    113.  
    114. dw irq_timer
    115. db 0x8
    116. db 0x0
    117. db 00000000b
    118. db 10001110b
    119. db 0x0
    120. db 0x0
    121.  
    122. idtr:
    123. dw 2047
    124. dd idt
    125.  
    126. times 510-($-$$) db 0
    127. db 0xaa, 0x55
    На Bochs 2.1.1 работает нормально, записываю в первый сектор дискеты и гружусь с нее - комп перезагружается. Думал что напутал со стеком, но никаких ошибок вроде не нашел.
     
  11. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    Странно, я же замаскировал все, кроме таймера, включая второй контроллер.
     
  12. shi

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    deathwisher
    я что-то путаю, или ты замаскировал только irq1-7? а 8-15? или там ничего нет?
     
  13. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    ну так я же irq2 отключил
     
  14. rdtsc

    rdtsc Параллелепипедов Артем

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    180
    Адрес:
    Москва
    Привет, спецы по 8259 ,правильно ли я включаю СпэшлМаскинг мод на ПКП ,состоящим из 3х контроллеров,

    Код (Text):
    1. SetSM proc
    2.     push ax
    3.     cli
    4.     [b];3 ПКП - 1 мастер и 2 подчиненых,подключенных к irq6,irq7[/b]
    5.     [b];програмируем Мастер-контроллер(далее МК)[/b]
    6.     mov al,10001b ;icw1 (будет icw3,icw4,каскадное подключение)
    7.     out 20h,al
    8.     ;
    9.     mov al,1000b ;icw2(базовый адрес для irq0)
    10.     out 21h,al
    11.     ;
    12.     mov al,11000000b ;icw3(irq6,7 - заняты ведомыми контроллерами)
    13.     out 21h,al
    14.     ;
    15.     mov al,1101b ;icw4
    16.                     ;Спец.вложенный режим -выключим (если включить - то 11101b)
    17.                     ;буферизир.сист.шин  -лучше включить,т.к -
    18.                      ; прим.(на одном сайте написано,что если это сброшено,то следующий бит игнорируется)
    19.                     ;мы - Ведущий-ПКП
    20.                     ;нет режмиа автосброса ISR (конца прерывания)
    21.                     ;тип ЦП 8086
    22.     out 21h,al    ;
    23.     ;
    24.     ;[b]програмируем ведомый ПКП 1:[/b]
    25.     mov al,10001b ;icw1 (будет icw3,icw4,каскадное подключение)
    26.     out 0a0h,al
    27.     ;
    28.     mov al,10000b ;icw2(базовый адрес)
    29.     out 0a1h,al
    30.     ;
    31.     mov al,110b
    32.     out 0a1h,al ;icw3(наш ведомый ПКП 1 подключен к 6му irq)
    33.     ;
    34.     mov al,1001b
    35.     out 0a1h,al ;icw4
    36.                     ;Спец.вложенный режим -выкл,(если вкл - то 1001b)
    37.                     ;буферизир.сист.шин
    38.                     ;мы - Ведомый-ПКП
    39.                     ;нет режмиа автосброса ISR (конца прерывания)
    40.                     ;тип ЦП 8086
    41.     ;
    42.     [b];програмируем ведомый ПКП 2:[/b]
    43.     mov al,10001b ;icw1 (будет icw3,icw4,каскадное подключение)
    44.     out 0a0h,al
    45.     ;
    46.     mov al,11000b ;icw2(базовый адрес)
    47.     out 0a1h,al
    48.     ;
    49.     mov al,111b ;icw3(наш ведомый ПКП 2 подключен к 7му irq)
    50.     out 0a1h,al
    51.     ;
    52.     mov al,1001b
    53.     out 0a1h,al ;icw4(аналогично ведомому ПКП 1)
    54.     ;
    55.     [b];устанавливаем Режим спец.маскирования[/b] для ведущего и ведомых контроллеров.
    56.     mov al,1101000b ;ocw3 для ведущего ПКП
    57.     out 20h,al
    58.     ;нигде не нашел,нужно ли это делать для ведомого
    59.     ;но ocw3 распространяетя и на ведомый(порт 0a0h) -поэтому решил включить и в ведомом:
    60.     mov al,1101000b ;ocw3 для ведомых ПКП
    61.     out 0a0h,al
    62.  
    63.     sti
    64.     pop ax
    65.     ret
    66. SetSM endp