diff --git a/README.md b/README.md index c87d09c..2fc956a 100644 --- a/README.md +++ b/README.md @@ -330,3 +330,6 @@ But TODO I don't think you can see where you are in the kernel source code and l 1. [timer](kernel_module/timer.c) 1. [work_from_work](kernel_module/work_from_work.c) 1. [irq](irq.c) + 1. Module dependencies + 1. [dep.c](kernel_module/dep.c) + 1. [dep2.c](kernel_module/dep2.c) diff --git a/busybox_config_fragment b/busybox_config_fragment index 9a827c9..5e2451e 100644 --- a/busybox_config_fragment +++ b/busybox_config_fragment @@ -1,3 +1,4 @@ +CONFIG_DEPMOD=y CONFIG_MODINFO=y CONFIG_NC=y CONFIG_NC_EXTRA=y diff --git a/kernel_module/dep.c b/kernel_module/dep.c new file mode 100644 index 0000000..6f77040 --- /dev/null +++ b/kernel_module/dep.c @@ -0,0 +1,73 @@ +/* +Exports the lkmc_dep which dep2.ko uses. + + insmod /dep.ko + # dmesg => 0 + # dmesg => 0 + # dmesg => ... + insmod /dep2.ko + # dmesg => 1 + # dmesg => 2 + # dmesg => ... + rmmod dep + # Fails because dep2 uses it. + rmmod dep2 + # Dmesg stops incrementing. + rmmod dep + +sys visibility: + + dmesg -n 1 + insmod /dep.ko + insmod /dep2.ko + ls -l /sys/module/dep/holders + # => ../../dep2 + cat refcnt + # => 1 + +depmod: + + grep dep "/lib/module/"*"/depmod" + # extra/dep2.ko: extra/dep.ko + # extra/dep.ko: + modprobe dep + # lsmod + # Both dep and dep2 were loaded. + +TODO: at what point does buildroot / busybox generate that file? +*/ + +#include /* usleep_range */ +#include +#include +#include + +MODULE_LICENSE("GPL"); + +int lkmc_dep = 0; +EXPORT_SYMBOL(lkmc_dep); +static struct task_struct *kthread; + +static int work_func(void *data) +{ + while (!kthread_should_stop()) { + printk(KERN_INFO "%d\n", lkmc_dep); + usleep_range(1000000, 1000001); + } + return 0; +} + +static int myinit(void) +{ + kthread = kthread_create(work_func, NULL, "mykthread"); + wake_up_process(kthread); + return 0; +} + +static void myexit(void) +{ + kthread_stop(kthread); +} + +module_init(myinit) +module_exit(myexit) diff --git a/kernel_module/dep2.c b/kernel_module/dep2.c new file mode 100644 index 0000000..467b63e --- /dev/null +++ b/kernel_module/dep2.c @@ -0,0 +1,33 @@ +#include /* usleep_range */ +#include +#include +#include + +MODULE_LICENSE("GPL"); + +extern int lkmc_dep; +static struct task_struct *kthread; + +static int work_func(void *data) +{ + while (!kthread_should_stop()) { + usleep_range(1000000, 1000001); + lkmc_dep++; + } + return 0; +} + +static int myinit(void) +{ + kthread = kthread_create(work_func, NULL, "mykthread"); + wake_up_process(kthread); + return 0; +} + +static void myexit(void) +{ + kthread_stop(kthread); +} + +module_init(myinit) +module_exit(myexit)