From 5fd7ebaac1e94b84b282509cbcf9c69fbd57bb90 Mon Sep 17 00:00:00 2001 From: Arturs Artamonovs Date: Sat, 25 Nov 2023 12:02:55 +0000 Subject: Add procfs and kernel topic page --- md/notes/kernel/create_procfs_entry.md | 144 +++++++++++++++++++++++++++++++++ md/notes/kernel/create_thread.md | 45 +++++++++++ md/notes/kernel/topics.md | 22 +++++ md/notes/kernel/usermode_helper.md | 8 ++ md/random.md | 2 +- md/writeup/kernel_hello_world.md | 27 +++++++ 6 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 md/notes/kernel/create_procfs_entry.md create mode 100644 md/notes/kernel/create_thread.md create mode 100644 md/notes/kernel/topics.md create mode 100644 md/notes/kernel/usermode_helper.md diff --git a/md/notes/kernel/create_procfs_entry.md b/md/notes/kernel/create_procfs_entry.md new file mode 100644 index 0000000..03d186f --- /dev/null +++ b/md/notes/kernel/create_procfs_entry.md @@ -0,0 +1,144 @@ +title:Create procfs entry +keywords:kernel,linux,threads + +# Create procfs entry + +Lets extend hello world driver. + + +__Makefile__ +```Makefile +obj-m += procfs_entry.o + +KDIR ?= /lib/modules/$(shell uname -r)/build + +all: + make -C $(KDIR) M=$(PWD) modules + +clean: + make -C $(KDIR) M=$(PWD) clean +``` + +__procfs_entry.c__ +```c +#include /* Needed by all modules */ +#include + +int procfs_entry_init( void ) +{ + printk(KERN_DEBUG "Hello Procfs!\n"); + return 0; +} + +void procfs_entry_exit( void ) +{ + printk(KERN_DEBUG "Exit Procfs!\n"); +} + +module_init( procfs_entry_init ); +module_exit( procfs_entry_exit ); + +MODULE_LICENSE("GPL"); +``` + + +Create proc directory with + +```c +dir = proc_mkdir(DIR_NAME, PARENT_DIR); +``` + +under the directory create file that will contain data + +```c +proc_create("file", MODE, PARENT_DIR, PROC_FOPS) +``` + +Lets create /proc/secret/file. And define basic read/write operations. That at this +stage will do nothing. + +```c +#include + +static struct proc_dir_entry *procdir, *procfile; + +static int secret_open(struct inode *inode, struct file *file) { + return 0; +} + +static int secret_release(struct inode *inode, struct file *file) { + return 0; +} + +static ssize_t secret_read(struct file *file, char __user *buffer, size_t length, loff_t *offset) { + return 0; +} + +static ssize_t secret_write(struct file *file, const char *buffer, size_t length, loff_t *offset) { + return 0; +} + +static struct proc_ops procfs_ops = { + .proc_open = secret_open, + .proc_read = secret_read, + .proc_write = secret_write, + .proc_release = secret_release +}; + + +int procfs_entry_init( void ) { +... +procdir = proc_mkdir("secret", NULL); +if (procdir == NULL) { + pr_err("Cant create secret directory\n"); + return -1; +} + +procfile = proc_create("file", 0644, procdir, &procfs_ops); +if (procfile == NULL) { + pr_err("Cant create file under the secret\n"); + return -1; +} +... +} + +void procfs_entry_exit( void ) +{ + ... + //remove entries after unloading module + proc_remove(procdir); + proc_remove(procfile); + ... +} +``` + +Next step add data to read from file entry + + + + +## List of procfs functions used + +| Function name | Note | +|---|---| +| proc_mkdir | Create procfs directory | +| proc_create | Create procfs file | +| proc_remove | Remove procfs entry | + +## Final result + +__Makefile__ +```Makefile +``` + +__procfs_entry.c__ +```c +``` + +## Links + +https://elixir.bootlin.com/linux/v6.1.21/source/include/linux/proc_fs.h + + + + diff --git a/md/notes/kernel/create_thread.md b/md/notes/kernel/create_thread.md new file mode 100644 index 0000000..87830b1 --- /dev/null +++ b/md/notes/kernel/create_thread.md @@ -0,0 +1,45 @@ +title:Create threads +keywords:kernel,linux,threads + +# Create threads + +State of kernel thread - include/linux/sched.h + +```c +/* Used in tsk->state: */ +#define TASK_RUNNING 0x00000000 +#define TASK_INTERRUPTIBLE 0x00000001 +#define TASK_UNINTERRUPTIBLE 0x00000002 +#define __TASK_STOPPED 0x00000004 +#define __TASK_TRACED 0x00000008 +/* Used in tsk->exit_state: */ +#define EXIT_DEAD 0x00000010 +#define EXIT_ZOMBIE 0x00000020 +#define EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD) +/* Used in tsk->state again: */ +#define TASK_PARKED 0x00000040 +#define TASK_DEAD 0x00000080 +#define TASK_WAKEKILL 0x00000100 +#define TASK_WAKING 0x00000200 +#define TASK_NOLOAD 0x00000400 +#define TASK_NEW 0x00000800 +#define TASK_RTLOCK_WAIT 0x00001000 +#define TASK_FREEZABLE 0x00002000 +#define __TASK_FREEZABLE_UNSAFE (0x00004000 * IS_ENABLED(CONFIG_LOCKDEP)) +#define TASK_FROZEN 0x00008000 +#define TASK_STATE_MAX 0x00010000 + +#define TASK_ANY (TASK_STATE_MAX-1) +``` + +## Links + + +https://www.linuxtoday.com/blog/kernel-threads/ +http://www.embeddedlinux.org.cn/EssentialLinuxDeviceDrivers/final/ch03lev1sec1.html +https://elixir.bootlin.com/linux/v6.1.21/source/include/linux/sched.h +https://elixir.bootlin.com/linux/v6.1.21/source/kernel/sysctl.c + + + + diff --git a/md/notes/kernel/topics.md b/md/notes/kernel/topics.md new file mode 100644 index 0000000..b959bad --- /dev/null +++ b/md/notes/kernel/topics.md @@ -0,0 +1,22 @@ +title: Topics +keywords:blog,projects + +# + +Linux kernel programming topics + +## Topic + +[Compile kernel](/writeup/compile_linux_kernel.md) +[Hello world driver](/writeup/kernel_hello_world.md) + + + +[Procfs](/notes/kernel/create_procfs_entry.md) + + + + + + +[Kernel /dev/hwrng](/writeup/kernel_dev_hwrng.md) diff --git a/md/notes/kernel/usermode_helper.md b/md/notes/kernel/usermode_helper.md new file mode 100644 index 0000000..dd8155a --- /dev/null +++ b/md/notes/kernel/usermode_helper.md @@ -0,0 +1,8 @@ +title:User mode helper +keywords:kernel,linux,threads + +# User mode helper + + +## Links + diff --git a/md/random.md b/md/random.md index 2faa541..c6c3b1f 100644 --- a/md/random.md +++ b/md/random.md @@ -11,7 +11,7 @@ keywords:blog,projects | Project | Description | | --- | --- | | [Undefined C](notes/undefined_c/tutorial.md) | Undefined C tutorial | - +| [Kernel programming](notes/kernel/topics.md) | Linux Kernel programming | ### Non active diff --git a/md/writeup/kernel_hello_world.md b/md/writeup/kernel_hello_world.md index 5f1e7e6..eb4fdc8 100644 --- a/md/writeup/kernel_hello_world.md +++ b/md/writeup/kernel_hello_world.md @@ -53,3 +53,30 @@ Now if you havent done so ... install kernel headers of kernel that your system ```sh make ``` + +## Load module + +```sh +sudo insmod hello_world.ko +``` + +check that module is running + +```sh +lsmod | grep hello +``` + +## Unload module + +```sh +rmmod hello_world +``` + + +### Install kernel headers raspbian + +RaspberryPi4 ARMv8 + +```bash +sudo apt-get install raspberrypi-kernel-headers +``` -- cgit v1.2.3