2010-08-14 4 views
5

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

+1

То, о чем вы просите, как это сделать, это вещи, которые вы делаете при написании операционной системы, а не в приложении. Не могли бы вы объяснить немного больше о том, чего вы пытаетесь достичь? –

+0

На самом деле, я работаю над заданием для своего преподавателя, мне нужно изучить инструкцию IRET, поэтому мне нужна процедура обслуживания прерываний. После того, как я его написал, я должен «играть» с шестнадцатеричным кодом исполняемого файла и изменять IRET (удалять его или что-то еще), чтобы увидеть, что происходит. – protector

+3

Вы не можете писать ISR в C, это требует (некоторой) сборки. Вы не можете тестировать ISR в операционной системе с защищенным режимом. Изменение IRET приведет к краху кода. Поговорите со своим педагогом об этом задании. –

ответ

-1

sigaction. См. man 2 sigaction.

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

+2

Я не думаю, что это именно то, о чем спрашивает ОП. –

+0

Это не делает работу, она не делает реального прерывания. Если я не понял, я должен прервать процессор, а не приложение. – protector

1

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

3

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

0

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

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

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

Смежные вопросы