GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo escribir su propio módulo kernel de Linux con un ejemplo simple

¿Qué son los módulos del kernel?

Los módulos del kernel son fragmentos de código que se pueden cargar y descargar del kernel a pedido.

Los módulos del kernel ofrecen una manera fácil de ampliar la funcionalidad del kernel base sin tener que reconstruir o recompilar el kernel nuevamente. La mayoría de los controladores se implementan como módulos del kernel de Linux. Cuando esos controladores no son necesarios, podemos descargar solo ese controlador específico, lo que reducirá el tamaño de la imagen del kernel.

Los módulos del núcleo tendrán una extensión .ko. En un sistema Linux normal, los módulos del kernel residirán dentro del directorio /lib/modules//kernel/.

Anteriormente discutimos cómo compilar un kernel desde el código fuente.

Este tutorial explica cómo escribir un módulo Kernel utilizando un ejemplo simple de Hello World.

Yo. Utilidades para Manipular Módulos del Kernel

1. lsmod:lista de módulos que ya se han cargado

El comando lsmod enumerará los módulos que ya están cargados en el núcleo, como se muestra a continuación.

# lsmod
Module                  Size  Used by
ppp_deflate            12806  0 
zlib_deflate           26445  1 ppp_deflate
bsd_comp               12785  0 
..

2. insmod – Insertar Módulo en el Kernel

El comando insmod insertará un nuevo módulo en el kernel como se muestra a continuación.

# insmod /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko

# lsmod | grep "squash"
squashfs               35834  0

3. modinfo – Mostrar información del módulo

El comando modinfo mostrará información sobre un módulo del kernel como se muestra a continuación.

# modinfo /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko

filename:       /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko
license:        GPL
author:         Phillip Lougher 
description:    squashfs 4.0, a compressed read-only filesystem
srcversion:     89B46A0667BD5F2494C4C72
depends:        
intree:         Y
vermagic:       3.5.0-19-generic SMP mod_unload modversions 686

4. rmmod – Eliminar módulo del kernel

El comando rmmod eliminará un módulo del kernel. No puede eliminar un módulo que ya está en uso por cualquier programa.

# rmmod squashfs.ko

5. modprobe – Agregar o quitar módulos del kernel

modprobe es un comando inteligente que cargará/descargará módulos en función de la dependencia entre módulos. Consulte los comandos de modprobe para obtener ejemplos más detallados.

II. Escribir un módulo kernel Hello World simple

1. Instalando los encabezados de Linux

Debe instalar linux-headers-.. primero como se muestra a continuación. Según su distribución, use apt-get o yum.

# apt-get install build-essential linux-headers-$(uname -r)

2. Código fuente del módulo Hello World

A continuación, cree el siguiente módulo hello.c en el lenguaje de programación C.

#include <linux/module.h>    // included for all kernel modules
#include <linux/kernel.h>    // included for KERN_INFO
#include <linux/init.h>      // included for __init and __exit macros

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Lakshmanan");
MODULE_DESCRIPTION("A Simple Hello World module");

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello world!\n");
    return 0;    // Non-zero return means that the module couldn't be loaded.
}

static void __exit hello_cleanup(void)
{
    printk(KERN_INFO "Cleaning up module.\n");
}

module_init(hello_init);
module_exit(hello_cleanup);

Advertencia: Todos los módulos del kernel operarán en el espacio del kernel, un modo altamente privilegiado. Así que tenga cuidado con lo que escribe en un módulo del kernel.

3. Crear Makefile para compilar el módulo del kernel

El siguiente archivo MAKE se puede usar para compilar el módulo básico del kernel hello world anterior.

obj-m += hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Use el comando make para compilar el módulo del kernel hello world como se muestra a continuación.

# make

make -C /lib/modules/3.5.0-19-generic/build M=/home/lakshmanan/a modules
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-19-generic'
  CC [M]  /home/lakshmanan/a/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/lakshmanan/a/hello.mod.o
  LD [M]  /home/lakshmanan/a/hello.ko
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-19-generic'

Lo anterior creará el archivo hello.ko, que es nuestro módulo Kernel de muestra.

4. Insertar o quitar el módulo del kernel de muestra

Ahora que tenemos nuestro archivo hello.ko, podemos insertar este módulo en el kernel usando el comando insmod como se muestra a continuación.

# insmod hello.ko

# dmesg | tail -1
[ 8394.731865] Hello world!

# rmmod hello.ko

# dmesg | tail -1
[ 8707.989819] Cleaning up module.

Cuando se inserta un módulo en el kernel, se invocará la macro module_init, que llamará a la función hello_init. De manera similar, cuando se elimina el módulo con rmmod, se invocará la macro module_exit, que llamará a hello_exit. Usando el comando dmesg, podemos ver el resultado del módulo Kernel de muestra.

Tenga en cuenta que printk es una función que se define en el kernel y se comporta de manera similar a printf en la biblioteca IO. Recuerde que no puede usar ninguna de las funciones de la biblioteca del módulo del kernel.

Ahora ha aprendido los conceptos básicos para crear su propio módulo Linux Kernel.


Linux
  1. Cómo usar el comando Rmmod en Linux con ejemplos

  2. Linux:¿cómo determinar qué módulo contamina el kernel?

  3. Linux:¿un núcleo corrupto en Linux?

  4. Cómo crear subprocesos en Linux (con un programa de ejemplo en C)

  5. ¿Cómo construir un módulo del kernel de Linux para que sea compatible con todas las versiones del kernel?

Cómo rescatar su sistema Windows o Linux con Rescatux

Cómo crear tu propia distribución de Linux con Yocto en Ubuntu

Cómo averiguar la versión del kernel de Linux que se ejecuta en su PC

Cómo monitorear sus servidores Linux con Checkmk

Cron Vs Anacron:Cómo configurar Anacron en Linux (con un ejemplo)

¿Cómo construir fácilmente su propia distribución de Linux?