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

Тема в разделе "WASM.NT.KERNEL", создана пользователем NoName, 20 май 2008.

  1. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    есть следующий код:

    Код (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:

    Код (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

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

    Phantom_84 New Member

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

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    абсалютно
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    В обработчиках EOI делаешь?
     
  6. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    а что с IDT????????
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Может, в самом коде ошибка. Я например выполняю инициализацию немного по-другому.
    Код (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

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    вырезка из книги Зубкова С. В.
    Код (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

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    EOI делаю
    с idt все в порядке
     
  10. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    сделал как у вас работает все что нужно кроме 11-ого irq. Оно один раз (видно по диагностике) вызывается после разрешения командой sti и потом глухо почему-то.
     
  11. Barbos

    Barbos Slavon

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

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    ethernet
     
  13. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    ну а у тебя есть драйвер, обслуживающий этот изернет?
    Если нет, то все логично получается. Я вобще всегда москирую прерывания, в которых не нуждаюсь.
     
  14. Phantom_84

    Phantom_84 New Member

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

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    да, у Зубкова есть опечатки, но он пишет на русском, и доки по железу не всегда найти получается
     
  16. Barbos

    Barbos Slavon

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

    Phantom_84 New Member

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

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Barbos
    Написанно. Для режима 8086/8088 ADI не влияет. Там передается номер прерывания и адресс прерывания(вернее номер который записан).
     
  19. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    Спасибо, стало ясно:)
     
  20. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    пользуйтесь APIC
    PIC не актуален