next up previous contents index
Next: Ficheros de dispositivos de Up: Hola, mundo Previous: Makefiles para los módulos   Contents   Index


Módulos del núcleo de varios ficheros

A veces tiene sentido dividir el módulo del núcleo en varios ficheros de código. En este caso, tienes que hacer lo siguiente:

  1. En todos lo ficheros fuente menos en uno, añade la línea #define __NO_VERSION__. Esto es importante porque module.h normalmente incluye la definición de kernel_version, una variable global con la versión del núcleo para la que se compila el módulo. Si necesitas version.h, tienes que incluirla, porque module.h no lo hará por ti con __NO_VERSION__.

  2. Compila todos los ficheros fuente de la forma normal.

  3. Combina todos los ficheros objeto en uno solo. Bajo x86, hazlo con ld -m elf_i386 -r -o $<$nombre del módulo$>$.o $<$primer fichero fuente$>$.o $<$segundo fichero fuente$>$.o.

He aquí un ejemplo de módulo de este tipo.

start.c

/* start.c 
 * Copyright (C) 1999 by Ori Pomerantz
 * 
 * "Hola, mundo" - la versión módulo del núcleo.
 * Este fichero incluye justamente la rutina de comienzo
 */

/* Los ficheros de cabeceras necesarios */

/* Estándar en los módulos del núcleo */
#include <linux/kernel.h>   /* Estamos haciendo trabajo del núcleo */
#include <linux/module.h>   /* Específicamente, un módulo */



/* Distribuido con CONFIG_MODVERSIONS */
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif        



/* Inicializa el módulo */
int init_module()
{
  printk("Hola, mundo - este es el núcleo hablando\n");

  /* Si retornamos un valor distinto de cero, significa
   * que init_module falló y el módulo del núcleo
   * no puede ser cargado */
  return 0;
}

stop.c

/* stop.c 
 * Copyright (C) 1999 by Ori Pomerantz
 * 
 * "Hola, mundo" - la versión módulo del núcleo. Este 
 * fichero incluye justamente la rutina de parada.
 */

/* Los ficheros de cabeceras necesarios */

/* Estándar en los módulos del núcleo */
#include <linux/kernel.h>   /* Estamos haciendo trabajo del núcleo */

#define __NO_VERSION__      /* Este no es "el" fichero 
                             * del módulo del núcleo */
#include <linux/module.h>   /* Específicamente, un módulo */

#include <linux/version.h>   /* No incluido por 
                              * module.h debido  
                              * a __NO_VERSION__ */



/* Distribuido con CONFIG_MODVERSIONS */
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif        




/* Limpieza - deshacemos todo aquello que hizo init_module */
void cleanup_module()
{
  printk("La vida de un módulo del núcleo es corta\n");
}

Makefile

# Makefile para un módulo multiarchivo del núcleo

CC=gcc
MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX

hello.o:	start.o stop.o
		ld -m elf_i386 -r -o hello.o start.o stop.o

start.o:	start.c /usr/include/linux/version.h
		$(CC) $(MODCFLAGS) -c start.c

stop.o:		stop.c /usr/include/linux/version.h
		$(CC) $(MODCFLAGS) -c stop.c


next up previous contents index
Next: Ficheros de dispositivos de Up: Hola, mundo Previous: Makefiles para los módulos   Contents   Index
2003-08-27