Привет. Бьюсь над 64-битным кодом. В Long Mode создал заглушки для всех векторов прерываний и исключений, которые просто выводят на экран код сработавшего вектора (прямая запись в текстовом режиме). Как только сделаю sti - так сразу получаю exception 08 #DF. оно должно срабатывать при обработке ДРУГОГО исключения, но никакого до него вовсе нету!! После перехода в Long Mode убрал весь лишний код кроме инициализации дескрипторов в IDT на соответстующие заглушки. В Local APIC все LVT замаскированы, немаскируемые заблокированы. Выполняю STI, затем JMP $ и сразу же имею (меня имеет последние сутки) = #DF Поделитесь мыслями пожалуйста!
IDT находится в загруженном сегменте? Есть ли страничное преобразование и если есть, то есть ли отображение для IDT? Что говорит Bochs?
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 ?
Естественно, нужно замаскировать и перенаправить IRQ0-15 на адекватные обработчики с номерами > 32. BIOS на вектор 8 настраивает IRQ0 - это прерывание от таймера, а не RTC.
Так и сделал. Вот код перенаправления и разрешения ВСЕХ аппаратных прерываний: Код (Text): .... ... ... mov bx,02820h mov dx,0000h call INT_redirect_IRQ ... ... ... ... ... ... INT_redirect_IRQ: ; Установка перенаправлений IRQ и маскировка/размаскировка ; BX = { BL = Начало для IRQ 0..7, BH = начало для IRQ 8..15 } ; DX = Маска прерываний IRQ ( DL - для IRQ 0..7, DH - IRQ 8..15 ) 1-запрет,0-разрешено mov al,11h out 0a0h,al out 20h,al mov al,bh out 0a1h,al mov al,bl out 21h,al mov al,02 out 0a1h,al mov al,04 out 21h,al mov al,01 out 0a1h,al out 21h,al mov al,dh out 0a1h,al mov al,dl out 21h,al ret ... ... ... После этого таймер вырабатывает 20h , а клавиатура 21h Не могу добиться получения прерываний от мыши. Вот код разрешения мыши: Код (Text): ; запретить генерацию прерывания IRQ12 call PS2_Wait8042Buffer mov al,020h out 64h,al in al,60h mov ah,al call PS2_Wait8042Buffer mov al,060h out 64h,al mov al,ah and al,11111101b out 60h,al ; разрешить передачу данных от мыши call PS2_Wait8042Buffer mov al,0D4h ; команда для 8042 - послать мыши байт данных out 64h,al call PS2_Wait8042Buffer mov al,0F4h ; команда для мыши - разрешить передачу данных out 60h,al ; ожидать от мыши код подтверждения приема команды call PS2_WaitMouseData jz .error_datainput in al,60h cmp al,0FAh jnz .error_datainput ; разрешить генерацию прерывания IRQ12 call PS2_Wait8042Buffer mov al,020h out 64h,al in al,60h mov ah,al call PS2_Wait8042Buffer mov al,060h out 64h,al mov al,ah or al,10b out 60h,al Под Bochs ответы от мыши 0FAh на все команды приходят отлично - НО прерываний НЕ ВЫРАБАТЫВАЕТСЯ ! ни одного! на 2-ух реальных компьютерах даже ответы 0FAh не получаю и соответственно тоже никаких прерываний Помогите получить прерывания мыши! что я еще не сделал?
olegsys когда то писал 64 битную заготовку. вроде проблем не было... скиньте полный исходник, я на досуге гляну, если вы еще не решили проблему. К тому же, вы не показали таблицу дескрипторов IDT, как она у вас описана, я не видел их... Код в студию.
В клавиатурном контроллере есть флаг, разрешающий/запрещающий генерацию IRQ12. Плюс для мыши нужна команда инициализации.