es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Programación de LKM mientras es atómica

Estoy desarrollando un módulo del kernel de Linux, que se ve así:
“`

<h1>include <linux/kernel.h></h1>

<h1>include <linux/module.h></h1>

<h1>include <linux/init.h></h1>

MODULE<em>LICENSE("GPL");
MODULE</em>AUTHOR("Yo");
MODULE_DESCRIPTION("Algo algo");

int checkSomething(void) {
int someCpuFeature = 0;
<strong>asm</strong>("mov $1, %eax");
<strong>asm</strong>("cpuid");
<strong>asm</strong>("mov %%ecx, %0" : "=r" (someCpuFeature));
if (someCpuFeature & 32) {
return 1;
}
return 0;
}
int <em>_init init</em>module(void) {
if (!checkSomething()) {
printk(KERN<em>INFO "Salida\n");
return 0;
} else {
printk(KERN</em>INFO "Continuando\n");
}
return 0;
}

static void <em>_exit exit</em>module(void) {
printk(KERN_INFO "Desinstalando el módulo\n");
}
““
Y cuando lo cargué, intenté ver la salida desde dmesg.
Pero en lugar de imprimir solo “Salida/Continuando”, también se imprimió una traza de llamada,
y decía BUG: programando mientras es atómico: insmod/24641/0x06100800.
Investigué este error y encontré que tiene alguna conexión con el planificador y dormir en lugares en los que no se debe dormir, pero esta es la única funcionalidad del código,
Entonces creo que tiene algo que ver con la instrucción cpuid, pero no sé exactamente qué es.
¿Algún idea?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error que encontraste es causado por el código que se está ejecutando en un contexto atómico, lo que significa que no se permite realizar ninguna operación de programación o de suspensión. La instrucción cpuid en tu función checkSomething puede estar causando este problema, ya que puede hacer que la CPU se detenga y provoque problemas de programación.

    Una forma de solucionar este problema es utilizar un método alternativo para detectar la característica de la CPU que te interesa, como comprobar directamente el registro CR4. Este método no debería causar ninguna violación de contexto atómico y debería resolver el problema que encontraste.

    Otra solución es mover la función checkSomething fuera de la función init_module y llamarla desde un contexto no atómico. Esto también debería resolver el problema, ya que la función init_module se está ejecutando en un contexto atómico.

    Es importante tener en cuenta que ejecutar código en un contexto atómico puede causar problemas graves y se debe evitar cuando sea posible. Siempre es una buena idea revisar el código y asegurarse de que no cause ninguna violación de contexto atómico.

Comments are closed.