
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");

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.

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

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/
¿Dónde está tu copia de
init.h
y ¿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