From a152b9288b3dc285e4abf4ce635f38ab3f2f3adb Mon Sep 17 00:00:00 2001 From: Mara Date: Mon, 7 Mar 2022 00:10:13 +0200 Subject: [PATCH] Add text file with explanation for each solved exercise --- tools/labs/skels/Kbuild | 10 ++ .../skels/kernel_modules/1-2-test-mod/Kbuild | 3 + .../kernel_modules/1-2-test-mod/hello_mod.c | 21 +++ .../skels/kernel_modules/3-error-mod/Kbuild | 3 + .../kernel_modules/3-error-mod/err_mod.c | 26 ++++ .../skels/kernel_modules/4-multi-mod/Kbuild | 5 + .../skels/kernel_modules/4-multi-mod/mod1.c | 27 ++++ .../skels/kernel_modules/4-multi-mod/mod2.c | 4 + .../skels/kernel_modules/5-oops-mod/Kbuild | 3 + .../kernel_modules/5-oops-mod/oops_mod.c | 27 ++++ .../skels/kernel_modules/6-cmd-mod/Kbuild | 3 + .../skels/kernel_modules/6-cmd-mod/cmd_mod.c | 26 ++++ .../skels/kernel_modules/7-list-proc/Kbuild | 3 + .../kernel_modules/7-list-proc/list_proc.c | 31 ++++ tools/labs/skels/kernel_modules/8-kdb/Kbuild | 3 + .../skels/kernel_modules/8-kdb/hello_kdb.c | 142 ++++++++++++++++++ .../labs/skels/kernel_modules/9-dyndbg/Kbuild | 3 + .../skels/kernel_modules/9-dyndbg/dyndbg.c | 32 ++++ tools/labs/skels/kernel_modules/Lab01.txt | 30 ++++ 19 files changed, 402 insertions(+) create mode 100644 tools/labs/skels/Kbuild create mode 100644 tools/labs/skels/kernel_modules/1-2-test-mod/Kbuild create mode 100644 tools/labs/skels/kernel_modules/1-2-test-mod/hello_mod.c create mode 100644 tools/labs/skels/kernel_modules/3-error-mod/Kbuild create mode 100644 tools/labs/skels/kernel_modules/3-error-mod/err_mod.c create mode 100644 tools/labs/skels/kernel_modules/4-multi-mod/Kbuild create mode 100644 tools/labs/skels/kernel_modules/4-multi-mod/mod1.c create mode 100644 tools/labs/skels/kernel_modules/4-multi-mod/mod2.c create mode 100644 tools/labs/skels/kernel_modules/5-oops-mod/Kbuild create mode 100644 tools/labs/skels/kernel_modules/5-oops-mod/oops_mod.c create mode 100644 tools/labs/skels/kernel_modules/6-cmd-mod/Kbuild create mode 100644 tools/labs/skels/kernel_modules/6-cmd-mod/cmd_mod.c create mode 100644 tools/labs/skels/kernel_modules/7-list-proc/Kbuild create mode 100644 tools/labs/skels/kernel_modules/7-list-proc/list_proc.c create mode 100644 tools/labs/skels/kernel_modules/8-kdb/Kbuild create mode 100644 tools/labs/skels/kernel_modules/8-kdb/hello_kdb.c create mode 100644 tools/labs/skels/kernel_modules/9-dyndbg/Kbuild create mode 100644 tools/labs/skels/kernel_modules/9-dyndbg/dyndbg.c create mode 100644 tools/labs/skels/kernel_modules/Lab01.txt diff --git a/tools/labs/skels/Kbuild b/tools/labs/skels/Kbuild new file mode 100644 index 00000000000000..3c295804325440 --- /dev/null +++ b/tools/labs/skels/Kbuild @@ -0,0 +1,10 @@ +# autogenerated, do not edit +ccflags-y += -Wno-unused-function -Wno-unused-label -Wno-unused-variable +obj-m += ./kernel_modules/8-kdb/ +obj-m += ./kernel_modules/4-multi-mod/ +obj-m += ./kernel_modules/3-error-mod/ +obj-m += ./kernel_modules/5-oops-mod/ +obj-m += ./kernel_modules/6-cmd-mod/ +obj-m += ./kernel_modules/9-dyndbg/ +obj-m += ./kernel_modules/7-list-proc/ +obj-m += ./kernel_modules/1-2-test-mod/ diff --git a/tools/labs/skels/kernel_modules/1-2-test-mod/Kbuild b/tools/labs/skels/kernel_modules/1-2-test-mod/Kbuild new file mode 100644 index 00000000000000..3674ef2591b3d9 --- /dev/null +++ b/tools/labs/skels/kernel_modules/1-2-test-mod/Kbuild @@ -0,0 +1,3 @@ +ccflags-y = -Wno-unused-function -Wno-unused-label -Wno-unused-variable -DDEBUG + +obj-m = hello_mod.o diff --git a/tools/labs/skels/kernel_modules/1-2-test-mod/hello_mod.c b/tools/labs/skels/kernel_modules/1-2-test-mod/hello_mod.c new file mode 100644 index 00000000000000..3fac57752e06ca --- /dev/null +++ b/tools/labs/skels/kernel_modules/1-2-test-mod/hello_mod.c @@ -0,0 +1,21 @@ +#include +#include +#include + +MODULE_DESCRIPTION("Simple module"); +MODULE_AUTHOR("Kernel Hacker"); +MODULE_LICENSE("GPL"); + +static int my_hello_init(void) +{ + pr_debug("Hello!\n"); + return 0; +} + +static void hello_exit(void) +{ + pr_debug("Goodbye!\n"); +} + +module_init(my_hello_init); +module_exit(hello_exit); diff --git a/tools/labs/skels/kernel_modules/3-error-mod/Kbuild b/tools/labs/skels/kernel_modules/3-error-mod/Kbuild new file mode 100644 index 00000000000000..7bf41fb63f9589 --- /dev/null +++ b/tools/labs/skels/kernel_modules/3-error-mod/Kbuild @@ -0,0 +1,3 @@ +ccflags-y = -Wno-unused-function -Wno-unused-label -Wno-unused-variable + +obj-m = err_mod.o diff --git a/tools/labs/skels/kernel_modules/3-error-mod/err_mod.c b/tools/labs/skels/kernel_modules/3-error-mod/err_mod.c new file mode 100644 index 00000000000000..95cb3f9f24253c --- /dev/null +++ b/tools/labs/skels/kernel_modules/3-error-mod/err_mod.c @@ -0,0 +1,26 @@ +#include +#include +#include +/* TODO: add missing kernel headers */ + +MODULE_DESCRIPTION("Error module"); +MODULE_AUTHOR("Kernel Hacker"); +MODULE_LICENSE("GPL"); + +static int n1, n2; + +static int err_init(void) +{ + n1 = 1; n2 = 2; + pr_info("n1 is %d, n2 is %d\n", n1, n2); + + return 0; +} + +static void err_exit(void) +{ + pr_info("sum is %d\n", n1 + n2); +} + +module_init(err_init); +module_exit(err_exit); diff --git a/tools/labs/skels/kernel_modules/4-multi-mod/Kbuild b/tools/labs/skels/kernel_modules/4-multi-mod/Kbuild new file mode 100644 index 00000000000000..8c20fdcbbf82c3 --- /dev/null +++ b/tools/labs/skels/kernel_modules/4-multi-mod/Kbuild @@ -0,0 +1,5 @@ +ccflags-y = -Wno-unused-function -Wno-unused-label -Wno-unused-variable + +# TODO: add rules to create a multi object module +obj-m = mod.o +mod-y = mod1.o mod2.o diff --git a/tools/labs/skels/kernel_modules/4-multi-mod/mod1.c b/tools/labs/skels/kernel_modules/4-multi-mod/mod1.c new file mode 100644 index 00000000000000..08511866c460a1 --- /dev/null +++ b/tools/labs/skels/kernel_modules/4-multi-mod/mod1.c @@ -0,0 +1,27 @@ +#include +#include +#include + +MODULE_DESCRIPTION("Multi-file module"); +MODULE_AUTHOR("Kernel Hacker"); +MODULE_LICENSE("GPL"); + +extern int add(int a, int b); + +static int n1, n2; + +static int my_hello_init(void) +{ + n1 = 1; n2 = 2; + pr_info("n1 is %d, n2 is %d\n", n1, n2); + + return 0; +} + +static void hello_exit(void) +{ + pr_info("sum is %d\n", add(n1, n2)); +} + +module_init(my_hello_init); +module_exit(hello_exit); diff --git a/tools/labs/skels/kernel_modules/4-multi-mod/mod2.c b/tools/labs/skels/kernel_modules/4-multi-mod/mod2.c new file mode 100644 index 00000000000000..bc0af867d7c87c --- /dev/null +++ b/tools/labs/skels/kernel_modules/4-multi-mod/mod2.c @@ -0,0 +1,4 @@ +int add(int a, int b) +{ + return a + b; +} diff --git a/tools/labs/skels/kernel_modules/5-oops-mod/Kbuild b/tools/labs/skels/kernel_modules/5-oops-mod/Kbuild new file mode 100644 index 00000000000000..89de44c8b0e693 --- /dev/null +++ b/tools/labs/skels/kernel_modules/5-oops-mod/Kbuild @@ -0,0 +1,3 @@ +# TODO: add flags to generate debug information + +obj-m = oops_mod.o diff --git a/tools/labs/skels/kernel_modules/5-oops-mod/oops_mod.c b/tools/labs/skels/kernel_modules/5-oops-mod/oops_mod.c new file mode 100644 index 00000000000000..9fd1448572a94a --- /dev/null +++ b/tools/labs/skels/kernel_modules/5-oops-mod/oops_mod.c @@ -0,0 +1,27 @@ +#include +#include +#include +#include + +MODULE_DESCRIPTION("Oops generating module"); +MODULE_AUTHOR("So2rul Esforever"); +MODULE_LICENSE("GPL"); + +static int my_oops_init(void) +{ + char *p = 0; + + pr_info("before init\n"); + *p = 'a'; + pr_info("after init\n"); + + return 0; +} + +static void my_oops_exit(void) +{ + pr_info("module goes all out\n"); +} + +module_init(my_oops_init); +module_exit(my_oops_exit); diff --git a/tools/labs/skels/kernel_modules/6-cmd-mod/Kbuild b/tools/labs/skels/kernel_modules/6-cmd-mod/Kbuild new file mode 100644 index 00000000000000..2c5fe9cfd4de33 --- /dev/null +++ b/tools/labs/skels/kernel_modules/6-cmd-mod/Kbuild @@ -0,0 +1,3 @@ +ccflags-y = -Wno-unused-function -Wno-unused-label -Wno-unused-variable + +obj-m = cmd_mod.o diff --git a/tools/labs/skels/kernel_modules/6-cmd-mod/cmd_mod.c b/tools/labs/skels/kernel_modules/6-cmd-mod/cmd_mod.c new file mode 100644 index 00000000000000..3bd758897f3600 --- /dev/null +++ b/tools/labs/skels/kernel_modules/6-cmd-mod/cmd_mod.c @@ -0,0 +1,26 @@ +#include +#include +#include + +MODULE_DESCRIPTION("Command-line args module"); +MODULE_AUTHOR("Kernel Hacker"); +MODULE_LICENSE("GPL"); + +static char *str = "the worm"; + +module_param(str, charp, 0000); +MODULE_PARM_DESC(str, "A simple string"); + +static int __init cmd_init(void) +{ + pr_info("Early bird gets %s\n", str); + return 0; +} + +static void __exit cmd_exit(void) +{ + pr_info("Exit, stage left\n"); +} + +module_init(cmd_init); +module_exit(cmd_exit); diff --git a/tools/labs/skels/kernel_modules/7-list-proc/Kbuild b/tools/labs/skels/kernel_modules/7-list-proc/Kbuild new file mode 100644 index 00000000000000..45eb7676b7ec51 --- /dev/null +++ b/tools/labs/skels/kernel_modules/7-list-proc/Kbuild @@ -0,0 +1,3 @@ +ccflags-y = -Wno-unused-function -Wno-unused-label -Wno-unused-variable + +obj-m = list_proc.o diff --git a/tools/labs/skels/kernel_modules/7-list-proc/list_proc.c b/tools/labs/skels/kernel_modules/7-list-proc/list_proc.c new file mode 100644 index 00000000000000..9f2a31759e97f9 --- /dev/null +++ b/tools/labs/skels/kernel_modules/7-list-proc/list_proc.c @@ -0,0 +1,31 @@ +#include +#include +#include +/* TODO: add missing headers */ +#include + +MODULE_DESCRIPTION("List current processes"); +MODULE_AUTHOR("Kernel Hacker"); +MODULE_LICENSE("GPL"); + +struct task_struct *p; + +static int my_proc_init(void) +{ + p = current; + /* TODO: print current process pid and its name */ + pr_info("%s\n", p->comm); + /* TODO: print the pid and name of all processes */ + pr_info("%d\n", p->pid); + return 0; +} + +static void my_proc_exit(void) +{ + /* TODO: print current process pid and name */ + pr_info("%s\n", p->comm); + pr_info("%d\n", p->pid); +} + +module_init(my_proc_init); +module_exit(my_proc_exit); diff --git a/tools/labs/skels/kernel_modules/8-kdb/Kbuild b/tools/labs/skels/kernel_modules/8-kdb/Kbuild new file mode 100644 index 00000000000000..4453b28ab39c4d --- /dev/null +++ b/tools/labs/skels/kernel_modules/8-kdb/Kbuild @@ -0,0 +1,3 @@ +ccflags-y = -Wno-unused-function -Wno-unused-label -Wno-unused-variable + +obj-m = hello_kdb.o diff --git a/tools/labs/skels/kernel_modules/8-kdb/hello_kdb.c b/tools/labs/skels/kernel_modules/8-kdb/hello_kdb.c new file mode 100644 index 00000000000000..656a265d288927 --- /dev/null +++ b/tools/labs/skels/kernel_modules/8-kdb/hello_kdb.c @@ -0,0 +1,142 @@ +#include +#include +#include + +int kdb_write_address; +EXPORT_SYMBOL(kdb_write_address); + +noinline void dummy_func18(void) +{ + panic("Hello KDB has paniced!"); +} +noinline void dummy_func17(void) +{ + dummy_func18(); +} +noinline void dummy_func16(void) +{ + dummy_func17(); +} +noinline void dummy_func15(void) +{ + dummy_func16(); +} +noinline void dummy_func14(void) +{ + dummy_func15(); +} +noinline void dummy_func13(void) +{ + dummy_func14(); +} +noinline void dummy_func12(void) +{ + dummy_func13(); +} +noinline void dummy_func11(void) +{ + dummy_func12(); +} +noinline void dummy_func10(void) +{ + dummy_func11(); +} +noinline void dummy_func9(void) +{ + dummy_func10(); +} +noinline void dummy_func8(void) +{ + dummy_func9(); +} +noinline void dummy_func7(void) +{ + dummy_func8(); +} +noinline void dummy_func6(void) +{ + dummy_func7(); +} +noinline void dummy_func5(void) +{ + dummy_func6(); +} +noinline void dummy_func4(void) +{ + dummy_func5(); +} +noinline void dummy_func3(void) +{ + dummy_func4(); +} +noinline void dummy_func2(void) +{ + dummy_func3(); +} +noinline void dummy_func1(void) +{ + dummy_func2(); +} + +static int hello_proc_show(struct seq_file *m, void *v) { + seq_printf(m, "Hello proc!\n"); + return 0; +} + +static int hello_proc_open(struct inode *inode, struct file *file) { + return single_open(file, hello_proc_show, NULL); +} + +static int edit_write(struct file *file, const char *buffer, + size_t count, loff_t *data) +{ + kdb_write_address += 1; + return count; +} + +static int bug_write(struct file *file, const char *buffer, + size_t count, loff_t *data) +{ + dummy_func1(); + return count; +} + +static const struct proc_ops edit_proc_ops = { + .proc_open = hello_proc_open, + .proc_read = seq_read, + .proc_write = edit_write, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; + +static const struct proc_ops bug_proc_ops = { + .proc_open = hello_proc_open, + .proc_read = seq_read, + .proc_write = bug_write, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; + +static int __init hello_proc_init(void) { + struct proc_dir_entry *file; + file = proc_create("hello_kdb_bug", 0, NULL, &bug_proc_ops); + if (file == NULL) { + return -ENOMEM; + } + + file = proc_create("hello_kdb_break", 0, NULL, &edit_proc_ops); + if (file == NULL) { + remove_proc_entry("hello_kdb_bug", NULL); + return -ENOMEM; + } + return 0; +} + +static void __exit hello_proc_exit(void) { + remove_proc_entry("hello_kdb_bug", NULL); + remove_proc_entry("hello_kdb_break", NULL); +} + +MODULE_LICENSE("GPL"); +module_init(hello_proc_init); +module_exit(hello_proc_exit); diff --git a/tools/labs/skels/kernel_modules/9-dyndbg/Kbuild b/tools/labs/skels/kernel_modules/9-dyndbg/Kbuild new file mode 100644 index 00000000000000..a0d5f3af5202f1 --- /dev/null +++ b/tools/labs/skels/kernel_modules/9-dyndbg/Kbuild @@ -0,0 +1,3 @@ +EXTRA_CFLAGS = -Wall -g + +obj-m = dyndbg.o diff --git a/tools/labs/skels/kernel_modules/9-dyndbg/dyndbg.c b/tools/labs/skels/kernel_modules/9-dyndbg/dyndbg.c new file mode 100644 index 00000000000000..e9071e5a723535 --- /dev/null +++ b/tools/labs/skels/kernel_modules/9-dyndbg/dyndbg.c @@ -0,0 +1,32 @@ +#include +#include +#include + +MODULE_DESCRIPTION("Dyndbg kernel module"); +MODULE_AUTHOR("Dyndbg"); +MODULE_LICENSE("GPL"); + +void my_debug_func(void) +{ + pr_debug("Important dyndbg debug message1\n"); + pr_debug("Important dyndbg debug message2\n"); + pr_debug("Verbose dyndbg debug message\n"); +} +EXPORT_SYMBOL(my_debug_func); + + +static int dyndbg_init(void) +{ + printk(KERN_INFO "Hi dyndbg!\n" ); + my_debug_func(); + return 0; +} + +static void dyndbg_exit(void) +{ + printk(KERN_INFO "Bye dyndbg!\n" ); + my_debug_func(); +} + +module_init(dyndbg_init); +module_exit(dyndbg_exit); diff --git a/tools/labs/skels/kernel_modules/Lab01.txt b/tools/labs/skels/kernel_modules/Lab01.txt new file mode 100644 index 00000000000000..55f3f829e3f832 --- /dev/null +++ b/tools/labs/skels/kernel_modules/Lab01.txt @@ -0,0 +1,30 @@ +Exercitiul 1: Load & Unload module +Dupa make boot si deschiderea cu minicom trebuie sa apara directorul skel pe masina. +insmod skels/kernel_modules/1-2-test-mod/hello_mod.ko +rmmod skels/kernel_modules/1-2-test-mod/hello_mod.ko + +Exercitiul 2: +Ascundere print de la consola sa fie disponibila doar prin dmesg. +dmesg -n 5 + +Exercitiul 3: +Am comparat fisierele de la task 3 si task1-2, am observat ca lipseste linia cu #include + +Exercitiul 4:F +In fisierul Kbuild am completat regulile pentru a obtine modulul mod.ko ce este compus din mod1.o si mod2.o + +Exercitiul 5: +Dupa ce am dat modulului am folosit comanda dmesg | tail -32 > out pentru a inspecta outputul si identifica problema. + +BUG: kernel NULL pointer dereference, address: 00000000 +EIP: my_oops_init+0xd/0x22 [oops_mod] + +Apoi pentru a identifica excat linia am folosit: +addr2line -e skels/kernel_modules/5-oops-mod/oops_mod.o 0xd + +Exercitiul 6: +Am dat ca parametru in linia de comanda str atunci cand se da load modulului. +insmod skels/kernel_modules/6-cmd-mod/cmd_mod.ko str="tierd" + +Exercitiul 7: +Am fost nevoita sa mut declaratia lui p in afara functiei. Am afisat PID-ul si numele executabilului.