2010-08-14 10 views
5

¿Cómo puedo programar la interrupción del software en C? Sé que necesito escribir una rutina de mantenimiento de interrupción y luego interrumpir la CPU para que se pueda llamar a la rutina, pero no sé cómo hacerlo en C. Además, no sé cómo registrar esa rutina con el descriptor de interrupción mesa. Tengo una CPU x86-64 (AMD Turion64 X2) y estoy usando el compilador gcc. Cualquier ayuda sería apreciada.Interrupción del software

+1

Las cosas que te preguntas cómo hacer son cosas que haces cuando escribes un sistema operativo, no una aplicación. ¿Podría explicar un poco más sobre lo que está tratando de lograr? –

+0

En realidad, estoy trabajando en una tarea para mi facultad, necesito examinar la instrucción IRET, es por eso que necesito una rutina de servicio de interrupción. Después de que lo haya escrito, se supone que debo "jugar" con el código hexadecimal del archivo ejecutable y modificar el IRET (eliminarlo o algo así) para ver qué sucede. – protector

+3

No puede escribir ISR en C, requiere (algunos) ensamblaje. No puede probar los ISR en un sistema operativo en modo protegido. Alterar el IRET simplemente bloqueará el código. Habla con tu educador sobre esta tarea. –

Respuesta

-1

Use sigaction. Ver man 2 sigaction.

Para causar la interrupción, use raise o kill.

+2

No creo que esto es exactamente lo que OP está preguntando sobre ... –

+0

Esto no hace el trabajo, no hace una interrupción real. En caso de que no esté claro, se supone que debo interrumpir la CPU, no la aplicación. – protector

1

El sistema operativo oculta las interrupciones reales de las aplicaciones. Por lo que yo sé, no es posible a menos que esté corriendo en la capa kernel (anillo 0?)

3

El concepto de interrupciones no está incluido en la especificación C (y también es algo específico del procesador). La mayoría de los compiladores, incluido GCC, le permiten escribir código ensamblador en línea (o puede vincular un archivo escrito en ensamblaje a su programa). Pero el gran problema es que los sistemas operativos comunes (especialmente los que se ejecutan en modo de 64 bits) no le permitirán alterar la tabla de interrupción. Supongo que su mejor opción es buscar un sistema operativo de código abierto simple e instalar su controlador de interrupción de un programa normal (si el sistema operativo lo permite) o agregar su código al kernel. La razón por la cual no se puede simplemente ejecutar una pequeña porción de código en un simulador de procesador (o máquina virtual) es que el procesador necesita bastante configuración para entrar en el modo de 64 bits. Y los detalles exactos sobre cómo alterar la tabla de interrupción dependen de esa configuración.

0

escribir ISR no es una cuestión de lenguaje. sí puede hacerlo en C.

Es una cuestión de comprensión de su Kernel OS, sobre las rutinas que se llaman para registrar su ISR en una determinada línea de interrupción con GIC u otros controladores de interrupción y hacer una entrada en la tabla Descriptor de interrupción . Me gusta con Linux en ARM ... request_irq() para registrar un ISR con un controlador de IRQ y hacer una entrada en la tabla IRQ_DESC.

Por lo tanto, le sugerimos que compruebe primero el marco ISR de su sistema operativo respectivo.

Cuestiones relacionadas