Контроллер прерываний

Discussion in 'WASM.NT.KERNEL' started by NoName, May 20, 2008.

  1. NoName

    NoName New Member

    Blog Posts:
    0
    Joined:
    Aug 1, 2004
    Messages:
    1,229
    есть следующий код:

    Code (Text):
    1. ; Allow IRQs interrupts,
    2. ; replace IRQs from (8h-0fh)  to (30h-37h)
    3. ;                   (70h-77h) to (38h-3fh)
    4.  
    5.     in al,21h
    6.     mov LowIRQMask,al
    7.     mov bx,_SysInterruptMask
    8.     mov al,0
    9.     or al,bl                        
    10.     or al,3                         ; Timer & Keyboard must be allowed
    11.     out 21h,al
    12.     in al,0a1h
    13.     mov HighIRQMask,al
    14.     mov al,0
    15.     or al,bh
    16.     out 0a1h,al
    17.  
    18.     push 3830h
    19.     call _SysSetIRQs
    20.     add esp,4
    и SysSetIRQs:

    Code (Text):
    1. ;----------------------------------------
    2. ;    Set new IRQ Addresses
    3. ; bl - low vector base  (8 vects.)
    4. ; bh - high vector base (8 vects.)
    5. ;----------------------------------------
    6. _SysSetIRQs proc near          
    7.         push ebp
    8.         mov ebp,esp
    9.  
    10.         push ebx
    11.  
    12.         mov bx,word ptr [ebp + 8]
    13.         mov al,11h                    
    14.         out 20h,al                    
    15.         jmp short $+2
    16.         mov al,bl
    17.         out 21h,al
    18.         jmp short $+2
    19.         mov al,4h
    20.         out 21h,al
    21.         jmp short $+2
    22.         mov al,1h
    23.         out 21h,al
    24.         jmp short $+2
    25.         mov al,11h
    26.         out 0a0h,al
    27.         jmp short $+2
    28.         mov al,bh
    29.         out 0a1h,al
    30.         jmp short $+2
    31.         mov al,2h
    32.         out 0a1h,al
    33.         jmp short $+2
    34.         mov al,1h
    35.         out 0a1h,al
    36.  
    37.         pop ebx
    38.  
    39.         pop ebp
    40.         ret
    41.         endp
    с маской 0xffff или 0x0 результат один и тот же (работают не все прерывания что нужно), в чем ошибка?
     
  2. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    В PIC, как мне кажется, прерывания маскируются единичным значением бита, а не наоборот. Кроме того, для нормальной работы каскада должен быть размаскировано второе (при нумерации с нуля) прерывание. Ну и самое главное, у тебя прерывания от локальных источников могут быть замаскированы или перенаправлены в APIC.
     
  3. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    Кстати, генерация прерываний может быть отключена в самих контроллерах устройств, хотя не думаю, что причина именно в этом. Потом "все прерывания" будут работать, если они все задействованы устройствами. Ты уверен, что прерывания вообще должны происходить?
     
  4. NoName

    NoName New Member

    Blog Posts:
    0
    Joined:
    Aug 1, 2004
    Messages:
    1,229
    абсалютно
     
  5. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    В обработчиках EOI делаешь?
     
  6. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    а что с IDT????????
     
  7. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    Может, в самом коде ошибка. Я например выполняю инициализацию немного по-другому.
    Code (Text):
    1. ; ---------------------------------------------------------------------------
    2. ; Перепрограммирование контроллера прерываний
    3. ; ---------------------------------------------------------------------------
    4. ; На входе:
    5. ; bl - индекс обработчика для IRQ0 (должен быть кратен восьми)
    6. ; bh - индекс обработчика для IRQ8 (должен быть кратен восьми)
    7. ; dx - битовая маска для IRQ0-IRQ15 (0 - разрешение, 1 - запрет)
    8. ; ---------------------------------------------------------------------------
    9. ; На выходе: нет
    10. ; ---------------------------------------------------------------------------
    11. ; Используемые регистры: al
    12. ; ---------------------------------------------------------------------------
    13. reset_pic:
    14.         mov     al, 00010001b
    15.         out     20h, al
    16.         out     0A0h, al
    17.  
    18.         mov     al, bl
    19.         out     21h, al
    20.         mov     al, bh
    21.         out     0A1h, al
    22.  
    23.         mov     al, 00000100b
    24.         out     21h, al
    25.         mov     al, 02h
    26.         out     0A1h, al
    27.  
    28.         mov     al, [b]00001101b[/b]
    29.         out     21h, al
    30.         mov     al, [b]00001001b[/b]
    31.         out     0A1h, al
    32.  
    33.         mov     al, dl
    34.         out     21h, al
    35.         mov     al, dh
    36.         out     0A1h, al
    37.  
    38.         ret
     
  8. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    вырезка из книги Зубкова С. В.
    Code (Text):
    1. ; процедура init_pic
    2. ; выполняет инициализацию обоих контроллеров прерываний,
    3. ; отображая IRQ0 - IRQ7 на PIC1_BASE - PIC1_BASE+7,
    4. ; a IRQ8 - IRQ15 на PIC2_BASE - PIC2_BASE+7
    5. ; для возврата в стандартное состояние вызвать с
    6. ; PIC1_BASE = 08h
    7. ; PIC2_BASE = 70h
    8. init_picproc       near
    9.         cli
    10.         mov        al,00010101b         ; ICW1
    11.         out        20h,al
    12.         out        0A0h,al
    13.         mov        al,PIC1_BASE         ; ICW2 для первого контроллера
    14.         out        2lh,al
    15.         mov        al,PIC2_BASE         ; ICW2 для второго контроллера
    16.         out        0A1h,al
    17.         mov        al,04h               ; ICW.3 для первого контроллера
    18.         out        21h,al
    19.         mov        al,02h               ; ICW3 для второго контроллера
    20.         out        0A1h,al
    21.         mov        al,00001101b         ; ICW4 для первого контроллера
    22.         out        21h,al
    23.         mov        al,00001001b         ; ICW4 для второго контроллера
    24.         out        0A1h,al
    25.         sti
    26.         ret
    27. init_pic           endp
    У тебя
    должно быть
    У меня в подобной процедуре именно так
     
  9. NoName

    NoName New Member

    Blog Posts:
    0
    Joined:
    Aug 1, 2004
    Messages:
    1,229
    EOI делаю
    с idt все в порядке
     
  10. NoName

    NoName New Member

    Blog Posts:
    0
    Joined:
    Aug 1, 2004
    Messages:
    1,229
    сделал как у вас работает все что нужно кроме 11-ого irq. Оно один раз (видно по диагностике) вызывается после разрешения командой sti и потом глухо почему-то.
     
  11. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    а какое устройство у тебя на 11-м интеррапте?
    Иногда, в самом устройстве, которое сгенерило прерывание, прерывания запрещаются. Обработчик прерывания должен после обработки разрешить прерывания от этого устройства в самом устройстве через соответствующий регистр данного устройства (типа InterruptStatusRegister).
    Вобще с перываниями тут ветвистая архитектура. Если не ясно, после обеда могу попытаться прояснить.;)
     
  12. NoName

    NoName New Member

    Blog Posts:
    0
    Joined:
    Aug 1, 2004
    Messages:
    1,229
    ethernet
     
  13. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    ну а у тебя есть драйвер, обслуживающий этот изернет?
    Если нет, то все логично получается. Я вобще всегда москирую прерывания, в которых не нуждаюсь.
     
  14. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    Barbos, мне Зубков не указ, тем более что у него есть опечатки. Предпочитаю использовать документацию по железу. Так что должно быть, как у меня :)
     
  15. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    да, у Зубкова есть опечатки, но он пишет на русском, и доки по железу не всегда найти получается
     
  16. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    и, действительно, не ясно получается. Таблица прерываний в Protect Mode состоит из 8-байтных структур. А 2-й бит в посылке ICW1 определяет разрядность вектора. И вот у этого же Зубкова такая строка
    тогда, помню, наугад поставил единицу - заработало, ну и хорошо)).
    Конечно интересно будет поиграть с ним.
     
  17. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    Зы :) Я сам когда-то писал про четвертое слово инициализации и приводил в качестве примера такой код.
    Code (Text):
    1. mov     al, 00000001b
    2. out     21h, al
    3. out     0A1h, al
    Но там описывается вариативность установки второго и третьего битов. Источник: board.sysbin.com
     
  18. Pavia

    Pavia Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 17, 2003
    Messages:
    2,409
    Location:
    Fryazino
    Barbos
    Написанно. Для режима 8086/8088 ADI не влияет. Там передается номер прерывания и адресс прерывания(вернее номер который записан).
     
  19. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    Спасибо, стало ясно:)
     
  20. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    пользуйтесь APIC
    PIC не актуален