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

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


person protector    schedule 14.08.2010    source источник
comment
То, что вы спрашиваете, как сделать, это то, что вы делаете при написании операционной системы, а не приложения. Не могли бы вы объяснить немного больше о том, чего вы пытаетесь достичь?   -  person R.. GitHub STOP HELPING ICE    schedule 14.08.2010
comment
На самом деле, я работаю над заданием для своего факультета, мне нужно изучить инструкцию IRET, поэтому мне нужна процедура обслуживания прерываний. После того, как я это написал, я должен поиграть с шестнадцатеричным кодом исполняемого файла и изменить IRET (удалить его или что-то еще), чтобы посмотреть, что произойдет.   -  person protector    schedule 14.08.2010
comment
Вы не можете писать ISR на C, для этого требуется (некоторая) сборка. Вы не можете тестировать ISR в операционной системе с защищенным режимом. Изменение IRET просто приведет к сбою кода. Поговорите со своим воспитателем об этом задании.   -  person Hans Passant    schedule 14.08.2010


Ответы (4)


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

person Grim    schedule 24.08.2010

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

person Michael Baldry    schedule 24.08.2010

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

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

Поэтому мы предлагаем сначала проверить структуру ISR вашей соответствующей ОС.

person susheel pandey    schedule 19.03.2015

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

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

person Borealid    schedule 14.08.2010
comment
Это не делает работу, это не делает реального прерывания. В случае, если я был неясен, я должен прерывать процессор, а не приложение. - person protector; 14.08.2010