GNU/Linux >> Tutoriales Linux >  >> Linux

Llame a una función de espacio de usuario desde un módulo del kernel de Linux

Creo que la solución más simple sería crear un dispositivo de caracteres en su controlador de kernel, con sus propias operaciones de archivo para un archivo virtual. Entonces el espacio de usuario puede abrir este dispositivo O_RDWR . Tienes que implementar dos operaciones de archivos principales:

  • read -- así es como el núcleo pasa los datos al espacio de usuario. Esta función se ejecuta en el contexto del subproceso del espacio de usuario que llama al read() llamada al sistema y, en su caso, debería bloquearse hasta que el kernel tenga otro valor semilla del que necesite conocer la salida.

  • write -- así es como el espacio de usuario pasa datos al núcleo. En su caso, el núcleo simplemente tomaría la respuesta a la lectura anterior y la pasaría al hardware.

Entonces terminas con un bucle simple en el espacio de usuario:

while (1) {
    read(fd, buf, sizeof buf);
    calculate_output(buf, output);
    write(fd, output, sizeof output);
}

y ningún bucle en el kernel:todo se ejecuta en el contexto del proceso del espacio de usuario que está impulsando las cosas, y el controlador del kernel solo es responsable de mover los datos hacia/desde el hardware.

Dependiendo de cuál sea su "hacer algunas cosas al azar aquí" en el lado del kernel, es posible que no sea posible hacerlo de manera tan simple. Si realmente necesita el bucle del kernel, entonces necesita crear un subproceso del kernel para ejecutar ese bucle y luego tener algunas variables en la línea de input_data , input_ready , output_data y output_ready , junto con un par de colas de espera y cualquier bloqueo que necesite.

Cuando el subproceso del kernel lee datos, coloca los datos en input_ready y establece el input_ready marque y señale la cola de espera de entrada, y luego haga wait_event(<output_ready is set>) . El read la operación de archivo haría un wait_event(<input_ready is set>) y devolver los datos al espacio de usuario cuando esté listo. Del mismo modo el write la operación de archivo pondría los datos que obtiene del espacio de usuario en output_data y establecer output_ready y señalar la cola de espera de salida.

Otra forma (más fea y menos portátil) es usar algo como ioperm , iopl o /dev/port para hacer todo completamente en el espacio del usuario, incluido el acceso al hardware de bajo nivel.


Linux
  1. Linux:¿cómo recargar correctamente un módulo del kernel?

  2. Ejecutar una función de espacio de usuario desde el espacio del kernel

  3. ¿Cómo codificar un módulo del kernel de Linux?

  4. Redirigir la salida de un bloque de funciones a un archivo en Linux

  5. ¿El kernel de Linux tiene una función principal?

Cómo cargar o descargar un módulo del kernel de Linux

Cómo compilar el kernel de Linux desde cero {Guía paso a paso}

Comando Lsmod en Linux (Lista de módulos del kernel)

Comando Modprobe en Linux

Cómo construir el kernel de Linux desde cero

Falta de referencia del puntero NULL del kernel de Linux en memset de kzalloc