Программное прерывание - PullRequest
       14

Программное прерывание

5 голосов
/ 14 августа 2010

Как я могу запрограммировать программные прерывания на C? Я знаю, что нужно написать подпрограмму обработки прерываний, а затем прервать ЦП, чтобы эта подпрограмма могла быть вызвана, но я не знаю, как это сделать в C. Кроме того, я не знаю, как зарегистрировать эту подпрограмму с дескриптором прерывания. Таблица. У меня процессор x86-64 (AMD Turion64 X2), и я использую компилятор gcc. Любая помощь будет оценена.

Ответы [ 4 ]

3 голосов
/ 25 августа 2010

Концепция прерываний не включена в спецификацию C (и также в некоторой степени зависит от процессора). Большинство компиляторов, включая GCC, позволяют писать встроенный код сборки (или вы, конечно, можете связать файл, написанный на сборке, с вашей программой). Но большая проблема заключается в том, что обычные операционные системы (особенно те, которые работают в 64-битном режиме) не позволят вам изменить таблицу прерываний. Полагаю, вам лучше всего искать простую ОС с открытым исходным кодом и либо установить обработчик прерываний из обычной программы (если ОС это позволяет), либо добавить свой код в ядро. Причина, по которой вы не можете просто запустить небольшой фрагмент кода в симуляторе процессора (или виртуальной машине), заключается в том, что процессору требуется немало настроек для перехода в 64-битный режим. А точные детали того, как вы изменяете таблицу прерываний, зависят от этой настройки.

1 голос
/ 24 августа 2010

Операционная система скрывает реальные прерывания от приложений.Насколько я знаю, это невозможно, если вы не работаете на уровне ядра (кольцо 0?)

0 голосов
/ 19 марта 2015

написание ISR не зависит от языка. да, вы можете сделать это в C.

Это вопрос понимания ядра вашей ОС, о подпрограммах, которые вызываются для регистрации вашего ISR на определенной линии прерывания с помощью GIC или других контроллеров прерываний и создания записи в таблице дескрипторов прерываний. Как и в Linux на ARM. Его request_irq () регистрирует ISR с помощью контроллера IRQ и делает запись в таблице IRQ_DESC.

Так что предложите сначала проверить ISR-фреймворк вашей соответствующей ОС.

0 голосов
/ 14 августа 2010

Используйте sigaction. Смотри man 2 sigaction.

Чтобы вызвать прерывание, используйте raise или kill.

...