Agregar módulo al núcleo

Agregar módulo al núcleo
Revisaremos el proceso o los pasos necesarios para agregar un módulo de núcleo mientras el núcleo se ejecuta. También discutiremos las pocas utilidades útiles de Linux disponibles. Estas utilidades se pueden emplear para obtener información sobre el módulo ya presente en el núcleo de Linux, agregar un nuevo módulo y obtener la información sobre el módulo proporcionado.

Descripción

Comencemos con el módulo del núcleo; El módulo del núcleo es la funcionalidad lógica separada que se puede agregar en una etapa posterior en el núcleo de ejecución. Esto extiende las funciones/funciones del núcleo de Linux.

Estos módulos son archivos con la extensión como ".ko ”, que significa objetos de núcleo. Si nos encontramos con algún archivo con ".ko ”Como extensión, indica claramente que es un módulo de núcleo.

Algunos nombres de ejemplo de módulos son: módulos I2C.Ko, Hello-World.KO, etc.

El proceso de agregar un módulo de núcleo al núcleo también se conoce como la carga de un módulo de núcleo. El módulo del núcleo solo se puede cargar si es compatible con el árbol de origen del núcleo. Esto significa que el módulo del núcleo no es independiente de la plataforma. Estos se pueden cargar solo en el núcleo con el mismo árbol de origen y configuración de compilación.

Agregar/Cargar del módulo del núcleo

Linux proporciona una utilidad conocida como "Insmod". Esta es la utilidad que se puede usar para cargar el módulo del núcleo en el núcleo en funcionamiento.

Para cargar el módulo del núcleo, simplemente ejecute el comando como insmod seguido del nombre del archivo del módulo.

Tomemos un ejemplo de Hello-World.KO, un módulo que es el ejemplo clásico y solo imprime el mensaje Hello World. Para cargar el módulo de kernel de hello world, a continuación se encuentra el comando que se puede usar:

A continuación se adjunta una instantánea de muestra; El archivo resaltado es el módulo del kernel:

$ sudo insmod hello-world.KO

Ejemplo de instantánea:

Con la ejecución exitosa del comando anterior, nuestro módulo se agrega al kernel de Linux, y veremos el mensaje de impresión del módulo de kernel de hello-world en el búfer de impresión. Para verificar el mensaje del hello-world, use el comando dmesg. Si el comando no tiene un mensaje de error, entonces se puede considerar la adición del módulo es exitosa. A medida que extendemos las funciones del núcleo, requiere que los privilegios de súper usuario ejecute el "INSMOD". Ejemplo de salida del comando dmesg es el siguiente:

Sushilrathore-2: ~/Hello-World $ sudo Insmod Hello-World.KO
Sushilrathore-2: ~/Hello-World $ dmesg
[10500712.434672] Hola mundo
cienauser@haxv-srathore-2: ~/hello-world $

Confirmando que el módulo está cargado

Para confirmar si el módulo está cargado y presente entre los otros módulos en el núcleo de Linux. El comando "LSMOD" se puede usar para enumerar todos los módulos del núcleo. Emita el comando en el shell de Linux, y veremos la lista completa de los módulos cargados en el kernel de Linux. Emitiendo el LSMOD en mi sistema, veo la siguiente salida en la consola:

Sushilrathore-2: ~/Hello-World $ lsmod
Tamaño del módulo utilizado por
hola_world 16384 0
nf_conntrack_ipv6 20480 0
NF_DEFRAG_IPV6 20480 1 NF_CONNTRACK_IPV6
ip6table_filter 16384 0
IP6_Tables 28672 1 IP6Table_Filter
nf_conntrack_ipv4 16384 0
NF_DEFRAG_IPV4 16384 1 NF_CONNTRACK_IPV4
Xt_Recent 20480 0
Xt_Conntrack 16384 0
nf_conntrack 135168 3 Xt_conntrack, NF_CONNTRACK_IPV6, NF_CONNTRACK_IPV4
cpuid 16384 0
ippable_filter 16384 1
ipmi_devintf 20480 0
ipmi_msghandler 53248 1 ipmi_devintf

Como podemos ver en los registros anteriores, hay muchos módulos enumerados, y nuestro módulo Hello-World también está en la lista; y lo he resaltado para facilitar manchas.

Entonces confirmamos que nuestro módulo está cargado en el núcleo con éxito.

Eliminar/descargar el módulo del núcleo

Para eliminar o descargar el módulo del kernel, podemos usar el comando Linux "RMMOD". Este es el comando que se utiliza para eliminar el módulo de núcleo cargado y enumerado por LSMOD. Esta operación también requiere privilegios de superusor. Volviendo a nuestro ejemplo de Hello-World, si deseamos eliminar el módulo de núcleo Hello-World que hemos cargado anteriormente. Necesitamos emitir el siguiente comando:

Sushilrathore-2: ~/Hello-World $ sudo rmmod hello_world
Sushilrathore-2: ~/Hello-World $

Después de la ejecución del comando, si no se ve nada en la consola, yo.mi. No hay ningún mensaje de error. Esto significa que la descarga/eliminación del módulo del núcleo es exitoso.

Confirmando la eliminación/descarga del módulo

Nuevamente para confirmar si el módulo se descarga correctamente, podemos usar el comando LSMOD. Después de la eliminación del módulo del núcleo, no debemos ver el módulo presente en la lista de módulos proporcionados por "LSMOD".

El siguiente es la salida de ejemplo de mi sistema:

Sushilrathore-2: ~/Hello-World $ lsmod
Tamaño del módulo utilizado por
nf_conntrack_ipv6 20480 0
NF_DEFRAG_IPV6 20480 1 NF_CONNTRACK_IPV6
ip6table_filter 16384 0
IP6_Tables 28672 1 IP6Table_Filter
nf_conntrack_ipv4 16384 0
NF_DEFRAG_IPV4 16384 1 NF_CONNTRACK_IPV4
Xt_Recent 20480 0
Xt_Conntrack 16384 0
nf_conntrack 135168 3 Xt_conntrack, NF_CONNTRACK_IPV6, NF_CONNTRACK_IPV4
cpuid 16384 0
ippable_filter 16384 1
ipmi_devintf 20480 0
ipmi_msghandler 53248 1 ipmi_devintf
VMW_VSOCK_VMCI_TRANSPORT 32768 1
VSOCK 36864 2 VMW_VSOCK_VMCI_TRANSPORT
binfmt_misc 20480 1
Intel_rapl_perf 16384 0
Joydev 24576 0
Input_Leds 16384 0
VMW_Balloon 20480 0
serio_raw 16384 0
SHPCHP 36864 0
VMW_VMCI 69632 2 VMW_Balloon, VMW_VSOCK_VMCI_TRANSPORT

En la lista anterior, si verificamos, no encontraremos el módulo de kernel de hello world. Este doble confirma que el módulo se elimina del sistema.

Se ofrece una utilidad más importante, que se puede utilizar para obtener la información del archivo del módulo de kernel. "Modinfo" es el comando proporcionado para obtener los detalles del módulo de kernel ya presente.

Ejecutando el "Modinfo" con el módulo Hello-World Kernel obtenemos la siguiente salida:

Sushilrathore-2: ~/Hello-World $ Modinfo Hello-World.KO
FileName:/Home/Sushilrathore/Hello-World/Hello-World.KO
Descripción: Hola mundo!
Licencia: GPL
Srcversion: BBD5A60063B15C8D80048FD
depende:
Retpoline: y
Nombre: Hello_world
Vermágico: 4.15.0-163 Generic SMP Mod_Unload Modversiones
cienauser@haxv-srathore-2: ~/hello-world $

La información anterior son los detalles del módulo del núcleo. La información importante a tener en cuenta es que le proporciona el srcversion y el vermágico. Esta información se puede utilizar para identificar el núcleo con el que este módulo es compatible y se puede cargar en. Si intentamos agregar el módulo del kernel compilado para otras fuentes o kernel de Linux, obtendremos el error incompatible del comando INSMOD.

A continuación se muestra el código de muestra y el código de makefile que hemos utilizado en nuestra discusión anterior:

Hola Mundo.C

#incluir
#incluir
#incluir
MODULE_LICENSE ("GPL");
Módulo_description ("Hola mundo!");
static int __inithello_init (void)

printk (kern_info "Hello World \ n");
regresar 0;

void estático __exit hello_exit (void)

printk (kern_info "Goodbye World \ n");

módulo_init (hello_init);
MODULE_EXIT (Hello_Exit);

Makfile

obj-M = Hello-World.O

todo:

Módulos de make -c/lib/modules/$ (shell uname -r)/build/m = $ (pwd)

limpio:

hacer -c/lib/módulos/$ (shell uname -r)/construir m = $ (pwd) limpio

Conclusión

Hasta ahora, hemos discutido sobre el proceso de módulos del núcleo cargable/pasos para agregar el módulo del núcleo. INSMOD es el comando que discutimos para cargar el módulo del núcleo. Para confirmar si el módulo se carga correctamente, podemos usar el comando LSMOD y finalmente, para eliminar el comando rmmod se puede usar. Hay un Modinfo de utilidad más que se puede usar para imprimir los detalles del módulo del núcleo.