Исключение #DF Double Fault возникает первым непонятно откуда

Тема в разделе "WASM.OS.DEVEL", создана пользователем olegsys, 6 апр 2010.

  1. olegsys

    olegsys New Member

    Публикаций:
    0
    Регистрация:
    4 апр 2010
    Сообщения:
    10
    Привет. Бьюсь над 64-битным кодом. В Long Mode создал заглушки для всех векторов прерываний и исключений,
    которые просто выводят на экран код сработавшего вектора (прямая запись в текстовом режиме).
    Как только сделаю sti - так сразу получаю exception 08 #DF.

    оно должно срабатывать при обработке ДРУГОГО исключения,
    но никакого до него вовсе нету!!

    После перехода в Long Mode убрал весь лишний код кроме инициализации дескрипторов в IDT на соответстующие заглушки.
    В Local APIC все LVT замаскированы, немаскируемые заблокированы.

    Выполняю STI, затем JMP $
    и сразу же имею (меня имеет последние сутки) = #DF

    Поделитесь мыслями пожалуйста!
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    IDT находится в загруженном сегменте? Есть ли страничное преобразование и если есть, то есть ли отображение для IDT? Что говорит Bochs?
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    olegsys
    очевидно, у тебя что-то не так с прерыванием таймера, раз #DF ты ловишь сразу после sti
     
  4. olegsys

    olegsys New Member

    Публикаций:
    0
    Регистрация:
    4 апр 2010
    Сообщения:
    10
    Great

    Спасибо! Наверно на правильную мысль натолкнул насчет прерывания таймера.

    Последовательность моего кода примерная:
    1. В рельном режиме блокирую NMI, затем CLI
    3. Строю таблицы памяти PML4,PDP,PD и отображение 0-2 Мб первых тождественно, гружу CR3
    2. Прыгаю сразу в LongMode, там перезагружаю LGDT и LIDT - алгоритм проверенный сотни раз - здесь всё "вылизано"
    3. Ставлю все 255 дескрипторы типа InterruptGate в IDT на соответсвующие коды
    4. Инициализирую LocalAPIC, в нем маскирую все LVT
    5. делаю STI ....

    и вот тут ВНИМАНИЕ: получаю прерывание 08 !! (якобы #DF) - и сутки ищу ошибку :)

    Так может быть это не exception 08 - А ВЕКТОР ПРЕРЫВАНИЯ 08 : IRQ8 — часы реального времени (RTC) ???

    веть я же не перенаправлял вектора PICa никуда !
    Знающие подскажите: если я ничего не делал с I/O APIC - он работает в режиме PIC ???
    и соответственно он посылает Local APICу номер вектора прерывания в прямом виде как было в Real ?
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Естественно, нужно замаскировать и перенаправить IRQ0-15 на адекватные обработчики с номерами > 32. BIOS на вектор 8 настраивает IRQ0 - это прерывание от таймера, а не RTC.
     
  6. olegsys

    olegsys New Member

    Публикаций:
    0
    Регистрация:
    4 апр 2010
    Сообщения:
    10
    Так и сделал. Вот код перенаправления и разрешения ВСЕХ аппаратных прерываний:
    Код (Text):
    1. .... ... ...               
    2. mov bx,02820h
    3. mov dx,0000h
    4. call INT_redirect_IRQ
    5. ... ... ...
    6.  
    7. ... ... ...
    8. INT_redirect_IRQ:
    9. ; Установка перенаправлений IRQ и маскировка/размаскировка
    10. ; BX = { BL = Начало для IRQ 0..7, BH = начало для IRQ 8..15 }
    11. ; DX = Маска прерываний IRQ ( DL - для IRQ 0..7, DH - IRQ 8..15 ) 1-запрет,0-разрешено
    12.     mov al,11h
    13.     out 0a0h,al
    14.     out 20h,al
    15.  
    16.     mov al,bh
    17.     out 0a1h,al
    18.     mov al,bl
    19.     out 21h,al
    20.  
    21.     mov al,02
    22.     out 0a1h,al
    23.     mov al,04
    24.     out 21h,al
    25.  
    26.     mov al,01
    27.     out 0a1h,al
    28.     out 21h,al
    29.  
    30.     mov al,dh
    31.     out 0a1h,al
    32.     mov al,dl
    33.     out 21h,al
    34.  
    35.     ret
    36. ... ... ...
    После этого таймер вырабатывает 20h , а клавиатура 21h

    Не могу добиться получения прерываний от мыши. Вот код разрешения мыши:
    Код (Text):
    1.           ; запретить генерацию прерывания IRQ12
    2.     call PS2_Wait8042Buffer
    3.     mov al,020h
    4.     out 64h,al
    5.     in al,60h
    6.     mov ah,al
    7.     call PS2_Wait8042Buffer
    8.     mov al,060h
    9.     out 64h,al
    10.  
    11.     mov al,ah
    12.     and al,11111101b
    13.     out 60h,al
    14.                       ; разрешить передачу данных от мыши
    15.                                            
    16.     call PS2_Wait8042Buffer
    17.     mov al,0D4h         ; команда для 8042 - послать мыши байт данных
    18.     out 64h,al
    19.     call PS2_Wait8042Buffer
    20.     mov al,0F4h         ; команда для мыши - разрешить передачу данных
    21.     out 60h,al
    22.                     ; ожидать от мыши код подтверждения приема команды
    23.     call PS2_WaitMouseData
    24.     jz .error_datainput
    25.     in al,60h
    26.     cmp al,0FAh
    27.     jnz .error_datainput
    28.  
    29.                     ; разрешить генерацию прерывания IRQ12
    30.     call PS2_Wait8042Buffer
    31.     mov al,020h
    32.     out 64h,al
    33.     in al,60h
    34.     mov ah,al
    35.     call PS2_Wait8042Buffer
    36.     mov al,060h
    37.     out 64h,al
    38.     mov al,ah
    39.     or al,10b
    40.     out 60h,al
    Под Bochs ответы от мыши 0FAh на все команды приходят отлично - НО прерываний НЕ ВЫРАБАТЫВАЕТСЯ !
    ни одного!
    на 2-ух реальных компьютерах даже ответы 0FAh не получаю и соответственно тоже никаких прерываний

    Помогите получить прерывания мыши! что я еще не сделал?
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    olegsys
    когда то писал 64 битную заготовку. вроде проблем не было... скиньте полный исходник, я на досуге гляну, если вы еще не решили проблему.
    К тому же, вы не показали таблицу дескрипторов IDT, как она у вас описана, я не видел их...
    Код в студию.
     
  8. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    В клавиатурном контроллере есть флаг, разрешающий/запрещающий генерацию IRQ12. Плюс для мыши нужна команда инициализации.