2009-05-03 10 views
7

¿Es posible compilar un módulo kernel de Linux (2.6) que incluya la funcionalidad definida por no kernel?Compilar el núcleo de Linux (2.6) módulo que incluye los encabezados no kernel

Por ejemplo:


kernelmodule.h

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/kernel.h> // printk() 
// ... 
#include <openssl/sha.h> 
// ... 

Makefile

obj-m := kernelmodule.o 
all: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules 

clean: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean 
    $(RM) Module.markers modules.order 

El módulo del kernel que he escrito y están tratando de recopilar contiene funcionalidad que se encuentra en un número de o penssl incluye archivos.

El archivo makefile presentado anteriormente no permite incluir fuera de los encabezados de linux. ¿Es posible incluir esta funcionalidad y, de ser así, podría señalarme en la dirección correcta?

Gracias, Mike

Respuesta

11

El núcleo no puede usar el código de usuarios y deben estar solos (es decir, ser totalmente autónomo, no hay bibliotecas), por lo tanto, no recoge las cabeceras estándar.

No está claro qué beneficio está tratando de recoger los encabezados de espacio de usuario. Si hay cosas allí que sería válido usar (constantes, algunas macros tal vez siempre que no llamen a ninguna función de espacio de usuario), entonces puede ser mejor duplicarlas e incluir solo las partes compatibles con el kernel que necesita.

No es posible vincular el kernel con bibliotecas diseñadas para el uso del espacio de usuario, incluso si no hacen ninguna llamada al sistema operativo, porque el entorno de enlace en el kernel no puede recogerlas.

En su lugar, recompile las funciones que se utilizarán en el kernel (suponiendo que no realicen ningún SO o llamadas a la biblioteca, por ejemplo, malloc, en cuyo caso deberán modificarse de todos modos). Incorpórelos a su propia biblioteca para usarlos en sus módulos kernel.


versiones recientes de Linux contienen funciones criptográficas de todas formas, incluyendo varios hashes SHA - tal vez usted puede utilizar uno de aquellos en su lugar.


Otra idea sería dejar de intentar hacer crypto en kernel-space y mover el código al espacio de usuario. El código de espacio de usuario es más fácil de escribir/depurar/mantener, etc.

6

He tomado bits del código de espacio de usuario que he escrito y lo he convertido para trabajar en el kernel (es decir, usando kmalloc(), etc.), no es tan difícil . Sin embargo, está limitado a la comprensión del kernel de C, no del espacio de usuario, que difiere ligeramente ... especialmente con varios tipos de int estándar.

Recién vinculado al espacio de usuario DSO no es posible: el kernel de Linux es monolítico, completamente autónomo. No usa libc del espacio de usuario, bibliotecas u otros bits como otros han notado.

9/10 veces, encontrará lo que necesita en algún lugar en el kernel.Es muy probable que alguien más haya encontrado la misma necesidad que usted y haya escrito algunas funciones estáticas en algún módulo para hacer lo que quiera. Solo agárrelas y vuelva a utilizarlas.

En el caso de la criptografía, como han dicho otros, simplemente use lo que está en el kernel. Una cosa a tener en cuenta es que necesitarás que estén habilitados en kconfig, lo que puede suceder o no dependiendo de lo que el usuario seleccione al compilarlo. Por lo tanto, tenga cuidado con las dependencias y sea explícito, puede que tenga que piratear algunas entradas en kconfig que también seleccionen la API de cifrado que desea cuando se selecciona su módulo. Hacer eso puede ser un poco doloroso al construir fuera del árbol.

Así que, por un lado, hemos "copiado y cambiado el nombre de las cosas al agregar relleno general", por el otro, tiene "decirle a las personas que deben tener la fuente completa del núcleo". Es uno de los caprichos que vienen con un kernel monolítico.

Con un Microkernel, casi todo se ejecuta en el espacio de usuario, no hay preocupaciones que se relacionen con un DSO para un controlador ... no es un problema. Por favor, no tome esa declaración como una señal para reiniciar la filosofía de diseño del núcleo en los comentarios, eso no está en el alcance de esta pregunta.

Cuestiones relacionadas