linux/init.h: No existe tal archivo o directorio

6 minutos de lectura

avatar de usuario
Roberto Crawford

Estoy tratando de construir un módulo de kernel para mi clase, y obtengo una enorme pared de errores, pero en la parte superior de dicha pared está el infame error “No existe tal archivo o directorio”. Parece ser la raíz del problema. Esto no solo parece afectar a init.h, sino también a module.h y kernel.h. Las tres primeras líneas del programa son las siguientes:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

Miré a mi alrededor y probé otras rutas para saber dónde deberían estar estos archivos al buscar problemas similares, pero nada ha funcionado hasta ahora. La parte más extraña es que ya usé este módulo; Me proporcionaron un código de inicio que tenía esto en la parte superior (no cambié nada) y no me dio ese error. Aunque, obviamente, el código posterior es diferente, pero este parece ser el mayor problema en este momento.

El código completo es el siguiente:

#include </usr/include/linux/init.h>
#include </usr/include/linux/module.h>
#include </usr/include/linux/kernel.h>

/* This function is called when the module is loaded. */
int simple_init(void)
{
    printk(KERN_INFO "Loading Module\n");
    static LIST_HEAD(birthday_list)
    struct birthday{
        int day;
        int month;
        int year;
        struct list_head list;
    };
    struct birthday *ptr, *next;
    struct birthday *bob;
    struct birthday *judy;
    struct birthday *josh;
    struct birthday *lana;
    struct birthday *jan;

    bob = kmalloc(sizeof(*bob), GFP_KERNEL);
    bob -> day = 17;
    bob -> month = 1;
    bob -> year = 1990;
    INIT_LIST_HEAD(&bob -> list);

    ...

    list_add_tail(bob -> list, &birthday_list);
    list_add_tail(judy -> list, &birthday_list);
    list_add_tail(josh -> list, &birthday_list);
    list_add_tail(lana -> list, &birthday_list);
    list_add_tail(jan -> list, &birthday_list);

    struct birthday *ptr;

    list_for_each_entry(ptr, &birthday_list, list){

        kprintf('%d/%d/%d \n', ptr -> month, ptr -> day,  ptr -> year);
    }

    list_for_each_entry_safe(ptr, &birthday_list, list){

        list_del(&ptr->list);
        kfree(ptr);
    }

       return 0;
}

/* This function is called when the module is removed. */
void simple_exit(void) {
    printk(KERN_INFO "Removing Module\n");
}

/* Macros for registering module entry and exit points. */
module_init( simple_init );
module_exit( simple_exit );

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simple Module");
MODULE_AUTHOR("SGG");

  • ¿Dónde está tu copia de init.hy ¿cuál es la ruta de inclusión que está pasando a gcc?

    – usuario590028

    10 de febrero de 2015 a las 3:23

  • Puedes publicar tu código ? ¿Está utilizando Makefile proporcionado en /lib/module?

    – Parham Alvani

    10 de febrero de 2015 a las 4:11

  • Bueno, tengo algunas cosas que informar. Por un lado, init.h y module.h parecen haberse desvanecido. Además, traté de solucionar este problema y las cosas… de alguna manera salieron mal. Intenté usar el comando “sudo apt-get install linux-headers-generic” y me dio un mensaje de error: “E: el paquete ‘linux-headers-generic’ no tiene ningún candidato de instalación”.

    –Robert Crawford

    10 de febrero de 2015 a las 4:20

  • No estoy usando el Makefile del que estás hablando, pero hay uno en el directorio del módulo que estoy tratando de ejecutar. En cuanto a la publicación del código, hay MUCHAS cosas de relleno en el medio que no son realmente importantes… Trabajaré para publicarlo; Lo tengo funcionando en una máquina virtual.

    –Robert Crawford

    10 de febrero de 2015 a las 4:59

avatar de usuario
Parham Alvani

Creo que primero debes instalar algo como linux-headers-[kernel version] por apt-get entonces debe crear Makefile de la siguiente manera:

ifneq ($(KERNELRELEASE),)
    # call from kernel build system
    lifo-objs := main.o
    obj-m   := lifo.o
else
   KERNELDIR ?= /lib/modules/$(shell uname -r)/build
   PWD       := $(shell pwd)
modules:
    echo $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules
    $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules
endif

clean:  
    rm -rf *.o *~ core .depend *.mod.o .*.cmd *.ko *.mod.c \
    .tmp_versions *.markers *.symvers modules.order

depend .depend dep:
    $(CC) $(CFLAGS) -M *.c > .depend

ifeq (.depend,$(wildcard .depend))
    include .depend
endif

establezca la variable KERNELDIR en el Makefile anterior a su versión de kernel adecuada, por defecto usa su kernel en ejecución. Si usa este Makefile, debe cambiar su inclusión al siguiente formato:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

Creo que para el desarrollo del módulo kernel use el kernel estándar de linus torvalds git es mejor. Para ver algún módulo kernel simple, consulte este.

  • Bueno, lo que pasa es que esto es para una tarea, por lo que nos dieron un archivo MAKE correcto para descargarlo y ponerlo en el directorio correcto (lo cual hice, ya que ya funcionó al menos una vez) e intenté obtener los encabezados. ¿Es esa la entrada exacta que necesitaría poner en la terminal?

    –Robert Crawford

    10 de febrero de 2015 a las 6:34

  • no, debes usar uname -r primero para obtener la versión de su kernel y luego use algo como sudo apt-get install linux-headers-3.13.0-24-generic para obtener el encabezado del kernel para la versión adecuada.

    – Parham Alvani

    10 de febrero de 2015 a las 6:45

  • sí, eso no funcionó. como los comentarios anteriores, no puede encontrar lo que estoy tratando de instalar

    –Robert Crawford

    10 de febrero de 2015 a las 7:01

  • Ok por favor envíame tu uname -r Salida en comentarios.

    – Parham Alvani

    10 de febrero de 2015 a las 7:11


  • Es realmente extraño, ahora parece estar funcionando sin ningún motivo. Estaba tratando de hacerlo antes de reunirme con mi profesor hoy, pero no lo logré. Lo abrimos esta mañana, lo ejecutamos, obtuvimos un montón de errores, seguro, pero este no fue uno de ellos. ¡Gracias por intentarlo!

    –Robert Crawford

    10 de febrero de 2015 a las 16:42

avatar de usuario
izak

Cuando construya módulos de kernel, debe usar Makefiles:

obj-m := module_name.o

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

all default: modules
install: modules_install

modules modules_install help clean:
    $(MAKE) -C $(KERNELDIR) M=$(shell pwd) $@

Hay un error tipográfico en la primera línea del código completo “/usr/unclude…” que podría ser responsable de la falla al encontrar init.h

avatar de usuario
CCG

Como se mencionó en algún comentario, que necesita instalar estos encabezados, más adelante, ellos (mantenedores de distribución) no envían el sistema operativo con los encabezados del controlador porque no todos los usan Ubunutu o cualquier distro acabará creando drivers.

Entonces, si alguien está usando ubuntu y enfrenta el mismo problema que se mencionó anteriormente, debe instalar los encabezados genéricos por

sudo apt install linux-headers-generic

y si está usando algo como arch o algo así, busque cómo instalar los encabezados de desarrollo del kernel, ahora podría funcionar para usted con solo poner, si no, intente reiniciar su sistema.

#include <init.h>
#include <module.h>

Si aún no funciona, debe buscar otra forma y dejar la compilación del archivo para makefile así que instale la marca primero

sudo apt install make

cree un archivo make y agréguele las siguientes líneas:

obj-m += foo.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

Para más visita —
https://www.linuxquestions.org/questions/programming-9/linux-module-h-915605/

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad