Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2017, 14:29   #1
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию Прерывания.

Такой вопрос встал в ступор.
Что могут обрабатывать прерывания MSI , а что не могут?
А что могут обрабатывать прерывания от контроллера APIC, а что не могут?
Nikolay2015 вне форума Ответить с цитированием
Старый 25.08.2017, 15:01   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

https://docs.microsoft.com/en-us/win...led-interrupts
waleri вне форума Ответить с цитированием
Старый 25.08.2017, 15:12   #3
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Конечно, спасибо. Но это не даёт ответа на мой вопрос. А какие устройства поддерживаются.(К примеру клавиатура в MS Interrupts)
Nikolay2015 вне форума Ответить с цитированием
Старый 25.08.2017, 15:22   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Там исчерпывающий ответ. Если не поняли поясняю.
MSI это вид прерываний PCI.
Их могут генерировать только PCI устройства. И то не все, а только те устройства которые это поддерживают.
А приемником этих прерываний как раз и является APIC.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.08.2017, 15:57   #5
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

То есть мне надо обрабатывать прерывания устройств (кроме PCI) , через таблицу IDT?
Nikolay2015 вне форума Ответить с цитированием
Старый 25.08.2017, 16:21   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Nikolay2015 У вас с Русским языком очень плохо. Трудно понять, то о чём вы думаете когда пишете.

Цитата:
Сообщение от Nikolay2015 Посмотреть сообщение
То есть мне надо обрабатывать прерывания устройств (кроме PCI) , через таблицу IDT?
Почему кроме? Всех.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.08.2017, 16:24   #7
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
У вас с Русским языком очень плохо. Трудно понять, то о чём вы думаете когда пишете.
Согласен. Нет времени распинаться на телефоне. Извиняюсь.
А так спасибо за ответы))
Nikolay2015 вне форума Ответить с цитированием
Старый 25.08.2017, 20:17   #8
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

По поводу прерываний. У меня есть обработчик #GP - прерывания.
При срабатывании данного прерывания я вызываю прерывание int 1-> отладка.
В обработчике отладки вывожу строку.
Код:
        xor eax, eax
        mov edi, eax
        mov ah, 07h
_debug:
        lodsb
        mov  [es:edi*2], al
        inc  dword [cursor]
        test al, al
        jnz  _debug
        xor eax,eax
        mov edi, eax
        popad
        jmp int_EOI

int_EOI:
         push ax
         mov  al, 20h
         out  020h, al
         out  0a0h, al
         pop  ax
         iret
global_catch_int:
         pop eax ;код ошибки
         mov  esi, gp
         int  1
Когда запускаю это всё виртуалке (Virtual box)
У меня происходит два случая (зависит от текста почему-то):
1. Сразу виртуальная машина кидает исключение и ничего не выводит
Код:
gp db 'GENERAL PROTECTION FAULT',0
2. Ничего не выводит секунд 19-20, а потом опять кидает исключение с символом звёздочка на экране "*"
2.1 Либо не кидает исключение и ничего не выводит
Код:
gp db '*** GENERAL PROTECTION FAULT ***',0
Nikolay2015 вне форума Ответить с цитированием
Старый 25.08.2017, 21:22   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Nikolay2015
Скорее всего придел сегмента DS неверный. Кажите свою GDT.

Выводиться звёздочку затем при попытке записать в cursor выходите за придел.
Происходит двойная ошибка. Причем она у вас зацикливается, до тех пор пока весь стек не исчерпается, затем срабатывает тройная ошибка и виртуалка перезагружается.

Я всегда DS настраиваю на корректный и после уже работаю. При приходе исключения только стек является корректно настроенным( и то не всегда)

Ещё у вас команда popad - не имеет пары.

Цитата:
Сообщение от Nikolay2015 Посмотреть сообщение
jmp int_EOI
int_EOI:
Тут это лишнее. У вас же внутреннее прерывание, а не внешнее(аппаратное).

И код лучше отлаживать. Есть же удалённая отладка через gdb или же через bochs
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 25.08.2017 в 21:28.
Pavia вне форума Ответить с цитированием
Старый 25.08.2017, 21:30   #10
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Дескриптор данных
Код:
DATA_DESC:
    dw 0xFFFF       ; limit low
    dw 0           ; base low
    db 0            ; base middle
    db 10010010b    ; access
    db 11001111b    ; granularity
    db 0            ; base high
Код:

syscall_int:
        pushad
        xor eax, eax
        mov edi, eax
        mov ah, 07h
_debug:
        lodsb
        mov  [es:edi*2], al
        inc  dword [cursor]
        test al, al
        jnz  _debug
        xor eax,eax
        mov edi, eax
        popad
        jmp int_EOI

int_EOI:
         push ax
         mov  al, 20h
         out  020h, al
         out  0a0h, al
         pop  ax
         iretd

global_catch_int:
         pop eax
         mov  esi, gp
         int  1
   
gp db ' GENERAL PROTECTION FAULT ',0
cursor dw 160

Последний раз редактировалось Nikolay2015; 25.08.2017 в 21:33.
Nikolay2015 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прерывания kolyan147 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 13.06.2012 23:55
прерывания lilek Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 14.12.2010 20:44
Прерывания alexdrew Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 16.05.2010 00:38
Прерывания Kn793 Общие вопросы Delphi 3 10.01.2009 18:43