Как я могу запрограммировать программное прерывание в C? Я знаю, что мне нужно написать процедуру обслуживания прерывания, а затем прервать ЦП, чтобы можно было вызвать процедуру, но я не знаю, как это сделать в C. Кроме того, я не знаю, как зарегистрировать эту процедуру с помощью дескриптора прерывания. стол. У меня процессор x86-64 (AMD Turion64 X2), и я использую компилятор gcc. Любая помощь будет оценена по достоинству.
Программное прерывание
Ответы (4)
Концепция прерываний не включена в спецификацию C (и также зависит от процессора). Большинство компиляторов, включая GCC, позволяют вам писать встроенный ассемблерный код (или, конечно, вы можете связать файл, написанный на ассемблере, с вашей программой). Но большая проблема заключается в том, что обычные операционные системы (особенно работающие в 64-битном режиме) не позволяют изменять таблицу прерываний. Я предполагаю, что вам лучше всего найти простую ОС с открытым исходным кодом и либо установить обработчик прерываний из обычной программы (если ОС позволяет это), либо добавить свой код в ядро. Причина, по которой вы не можете просто запустить небольшой фрагмент кода в симуляторе процессора (или виртуальной машине), заключается в том, что процессору требуется небольшая настройка для перехода в 64-битный режим. И точные детали того, как вы изменяете таблицу прерываний, зависят от этой настройки.
Операционная система скрывает реальные прерывания от приложений. Насколько я знаю, это невозможно, если вы не работаете на уровне ядра (кольцо 0?)
написание ISR не зависит от языка. да, вы можете сделать это в C.
Это вопрос понимания вашего ядра ОС, процедур, которые вызываются для регистрации вашего ISR на определенной линии прерывания с помощью GIC или других контроллеров прерываний и создания записи в таблице дескрипторов прерываний. Как и в случае с Linux на ARM. Это request_irq() для регистрации ISR с помощью контроллера IRQ и внесения записи в таблицу IRQ_DESC.
Поэтому мы предлагаем сначала проверить структуру ISR вашей соответствующей ОС.
Используйте 1_. См. man 2 sigaction
.
Чтобы вызвать прерывание, используйте raise
или kill
.