jsem začátečník a zkouším některé základy programování jádra v Linuxu. Dnes ráno jsem otevřel soubor module.h ve VIM a zavřel bez uložení jakýchkoliv změn. Po tom nejsem schopen sestavit žádný z mých kódů. Dostávám následující chybové hlášení
[[email protected] helloworld]# cc helloworld.c
helloworld.c:1:25: error: linux/module.h: No such file or directory
[[email protected] helloworld]#
Zde je ukázkový kód, který byl úspěšně spuštěn až do posledního dne.
#include<linux/module.h>
#include<linux/kernel.h>
int init_module(void)
{
printk("HELLO WORLD");
return 0;
}
void cleanup_module(void)
{
printk("GOODBYE");
}
Hledal jsem soubor module.h jako následující a existuje
[[email protected] usr]# find . -name module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-x86_64/module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-i386/module.h
./src/kernels/2.6.18-194.el5-i686/include/linux/module.h
./include/sepol/policydb/module.h
./include/sepol/module.h
./include/kde/kunittest/module.h
[[email protected] usr]#
Prosím pomozte mi. Používám CentOS ve virtuálním boxu.
Pokoušíte se kompilovat váš modul s prostým gcc
s žádným z Okolních prostředí kbuild. Možná jste s tímto přístupem dostali něco k práci v Minulosti, ale je to bolestné hrozné hrozné snažit se udržet modul Modulem používajícím cokoli jiného než čistě kbuild Makefile
přístupy. Já [….] Jsem plýtval příliš mnoho svého boje proti kbuildu a nechci, aby se to stalo s vámi […]. Si přečtěte Documentation/kbuild/modules.txt
před napsáním dalšího řádku kódu.
Co musíte udělat, je vytvořit Makefile
pro váš modul. Jeho obsah by měl vypadat takto:
ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m := modulename.o
else
# normal makefile
KDIR ?= /lib/modules/`uname -r`/build
default:
$(MAKE) -C $(KDIR) M=$$PWD
endif
Vím, že je to mnohem složitější než většina Makefile
s, které jste zvyklí vidět, , Ale slouží dvojímu účelu. Pokud v adresáři spustíte make
, bude Re-invoke make
používat mechanismus kbuild z aktuálně spuštěného jádra (Předpokládá se, že má alespoň symbolický odkaz z /lib/modules/.../build
do správné umístění).
Opětovně vyvolaný příkaz make
($(MAKE)
) bude správně sestavovat váš modul a Vám ušetří více času, než kdykoli oceníte. (Opravdu.)
Při provádění této práce udržujte Documentation/kbuild/modules.txt
po vaší straně.
Poznámka: Documentation/kbuild/modules.txt
může být k dispozici ve vašem systému Linux na adrese /usr/share/linux-headers-$(uname -r)/Documentation/kbuild/modules.txt
Nainstalujte balíček kernel-devel:
yum install kernel-devel
Poté byste měli mít:
/usr/src/kernels/$kernelversion/include/linux/module.h
Pak můžete předat něco jako:
-I/usr/src/kernels/$(uname -r)/include
kompilátoru
Možná budete potřebovat Makefile pro kompilaci modulu. Vyzkoušeli jsme si na svém osobním počítači (Ubuntu 10.04.4), setkávám se se stejným problémem, když používám gcc -c hello.c
, ale pomocí Makefile bude vše v pořádku. .32-54-obecný