Un mémo sur la construction et le chargement du module noyau
Vous pouvez obtenir stacktrace avec dump_stack ()
.
testmod.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
MODULE_LICENSE("MIT");
static int testmod_init(void)
{
printk(KERN_INFO "driver loaded\n");
dump_stack();
return 0;
}
static void testmod_exit(void)
{
printk(KERN_INFO "driver unloaded\n");
}
module_init(testmod_init);
module_exit(testmod_exit);
Makefile
KERNELSRCDIR = /lib/modules/$(shell uname -r)/build
ARCH=x86
#ARCH=arm
#CROSS_COMPILE=arm-none-linux-gnueabi-
VERBOSE = 0
obj-m := testmod.o
all:
make -C $(KERNELSRCDIR) \
M=$(PWD) \
KBUILD_VERBOSE=$(VERBOSE) \
ARCH=$(ARCH) \
CROSS_COMPILE=$(CROSS_COMPILE) \
modules
clean:
make -C $(KERNELSRCDIR) M=$(PWD) KBUILD_VERBOSE=$(VERBOSE) ARCH=$(ARCH) clean
point important:
Makefile
au lieu de makefile
Vérifiez le fonctionnement par insmod
$ make
$ sudo insmod testmod.ko
$ sudo rmmod testmod
$ dmesg
[20487.308696] testmod: module license 'MIT' taints kernel.
[20487.308709] Disabling lock debugging due to kernel taint
[20487.310110] driver loaded
[20487.310116] Pid: 32263, comm: insmod Tainted: P O XXXXX.x86_64 #1
[20487.310121] Call Trace:
[20487.310130] [<ffffffffa00f8000>] ? 0xffffffffa00f7fff
[20487.310138] [<ffffffffa00f801c>] testmod_init+0x1c/0x20 [testmod]
[20487.310146] [<ffffffff8100212a>] do_one_initcall+0x12a/0x180
[20487.310213] [<ffffffff810b60a6>] sys_init_module+0x10f6/0x20b0
[20487.310220] [<ffffffff815f38e9>] system_call_fastpath+0x16/0x1b
[20487.383930] driver unloaded
Résumé de la vérification des informations sur les modules du noyau - Qiita [Linux] [module noyau] Comment passer des paramètres comme arguments lors du chargement d'un module noyau chargeable --Qiita [Linux] [module noyau] Créer kthread dans le module noyau --Qiita
Compiling Kernel Modules Création d'un module de noyau Linux pour ARM-Serously makefile - Cross compiling a kernel module - Stack Overflow
Recommended Posts