c linux interrupt kernel-module

Secuestro del reloj en tiempo real en linux.



interrupt kernel-module (1)

Quiero escribir un LKM (Linux Kernel Module) que secuestra el reloj en tiempo real (interrupción 8). Así que quiero que la interrupción se ajuste a mi función y, en algún momento, la envíe a la antigua función.

He intentado usar la función request_irq sin ningún éxito, probablemente porque la función del núcleo que está allí no está dispuesta a compartir la interrupción (lo que es una buena decisión, supongo).
También intenté editar el IDT (Tabla de descriptores de interrupción), de acuerdo con algunas páginas que encontré. Ninguno de ellos funcionó, la mayoría ni siquiera compilaron, ya que se escribieron para el kernel 2.6, y yo trabajo con 3.10.

Este es un código simplificado que solo tengo para darle una idea de lo que estoy haciendo.

kpage =__get_free_page( GFP_KERNEL); asm("sidt %0": : "m"(*idtr) : ); memcpy(kpage, idtr, 256*sizeof(kpage)); newidt = (unsigned long long *)(*(unsigned long*)(idtr+1)); newidt[8] = &my_function; asm("lidt %0": "=m"(newidt):);

Todos mis intentos terminaron en buenos tiempos con una falla de segmentación, y en malos momentos con el kernel fallando, lo que me obligó a reiniciar (afortunadamente, trabajo con una máquina virtual e instantáneas).

Entonces, ¿cómo puedo secuestrar la interrupción en tiempo real para que haga mis cosas? (Y luego enviarlo de vuelta a la función original para que se ejecute.)

Here hay un buen código para cambiar la función de pagefault en el IDT. No pude hacerlo funcionar, ya que también está escrito para el kernel 2.6. También vale la pena examinar This pregunta.

Para obtener la recompensa, publique el código de trabajo, o al menos la información suficiente para que se ejecute.