Запрет IRQ из потока приложения

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
CRobin
постоялец
Сообщения: 145
Зарегистрирован: 26.01.2016 11:15:39

Запрет IRQ из потока приложения

Сообщение CRobin »

Здравствуйте. Нашел статью, где автор приводит примеры кода на ASM для запрета всех видов прерываний. https://dev64.wordpress.com/2012/11/15/ ... xceptions/

Насколько я понимаю, прерывания запрещаются для того процессора, на котором происходит выполнение потока, из которого были вызваны эти инструкции, в результате чего приложение как бы изолируется от остальной системы и выполняется изолировано.
Вот пример такого кода:

Код: Выделить всё

; запрет всех прерываний
cli
in   al, 70h
or   al, 80h
out  70h, al  ; запрет NMI


Код: Выделить всё

; разрешаем аппаратные прерывания и NMI
in   al, 70h
and  al, 7Fh
out  70h, al
sti


С процессором можно попрощаться в этот момент до тех пор, пока поток сам не снимет запрет на получения прерываний CPU. Проблема в том, что приведенные в статье примеры ASM кода мне воспроизвести не удалось, как и разобраться в коде, поскольку мои знания для этого слишком поверхностны. Возможно кто то сталкивался с подобной проблемой запрета прерываний? Если я правильно понял ситуацию, можно ли реализовать эту логику при помощи асемблерных вставок на паскале?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

CRobin писал(а):можно ли реализовать эту логику при помощи асемблерных вставок на паскале?


Код: Выделить всё

{$ASMMODE intel} // <=== Вверху модуля пишите вот такую команду

procedure myFunction(); assembler;
asm //  <=== после этой команды пишите Ваш код на assembler
in   al, 70h
and  al, 7Fh
out  70h, al
sti
end;


на форуме, полно примеров.


.
CRobin
постоялец
Сообщения: 145
Зарегистрирован: 26.01.2016 11:15:39

Сообщение CRobin »

vitaly_l спасибо за совет, только попробуйте этот код сперва а) скомпилировать б) запустить.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Скорее всего, у тебя просто не тот синтаксис. Переключи на интеловский либо директивой {$ASMMODE INTEL} , либо в настройках проекта. Возможно, потребуется соответствующий ассемблер.
CRobin
постоялец
Сообщения: 145
Зарегистрирован: 26.01.2016 11:15:39

Сообщение CRobin »

Лекс Айрин вроде чувак пишет для 64битных процов. Все компилируется но при запуске возникает ошибка SIGSEGV. Я ж правильно понял, что это все должно работать для обычного приложения из юзерспейс?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

зависит от оси.

В защищённом режиме, если её вызывает код, CPL которого численно больше IOPL, то процессор генерирует исключение #GP(0). Например, если IOPL = 2, то выполнять эту команду может код в 0, 1 и 2 кольцах защиты. Современные операционные системы устанавливают IOPL = 0, чтобы только ядро могло исполнять эту инструкцию.
CRobin
постоялец
Сообщения: 145
Зарегистрирован: 26.01.2016 11:15:39

Сообщение CRobin »

Лекс Айрин да, похоже прав не хватает для выполнения инструкций. Только на уровне ядра может выполнятся, на уровне приложения нет Изображение
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

вообще, по хорошему, в драйверах тоже должно. И я бы кольца немного по другому подписал.

ядро/драйвера/слой абстракции/приложения
CRobin
постоялец
Сообщения: 145
Зарегистрирован: 26.01.2016 11:15:39

Сообщение CRobin »

Лекс Айрин ядро/драйвера/вирусы/приложения :D
Ответить