From 7f3671894f1ad40b80dd1235eb2e169155c6e3a0 Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Fri, 29 Jun 2018 07:25:32 +0100 Subject: [PATCH] kernel_module: move character device example doc to README --- README.adoc | 77 +++++++++++++++++++++++ kernel_module/README.adoc | 2 - kernel_module/character_device.c | 21 ------- kernel_module/character_device_create.c | 6 -- rootfs_overlay/character_device.sh | 2 +- rootfs_overlay/character_device_create.sh | 4 +- 6 files changed, 80 insertions(+), 32 deletions(-) diff --git a/README.adoc b/README.adoc index 48e5fb1..2725478 100644 --- a/README.adoc +++ b/README.adoc @@ -2875,6 +2875,83 @@ Those commits change `BR2_LINUX_KERNEL_LATEST_VERSION` in `/linux/Config.in`. You should then look up if there is a branch that supports that kernel. Staying on branches is a good idea as they will get backports, in particular ones that fix the build as newer host versions come out. +=== Pseudo filesystems + +==== Character device + +.... +/character_device.sh +echo $? +.... + +Outcome: the test passes: + +.... +0 +.... + +Sources: + +* link:rootfs_overlay/character_device.sh[] +* link:rootfs_overlay/mknoddev.sh[] +* link:kernel_module/character_device.c[] + +Charcter device files are created with: + +.... +mknod c +.... + +Intuitively, for physical devices like keyboards, the major number maps to which driver, and the minor number maps to which device it is. + +A single driver can drive multiple compatible devices. + +The major and minor numbers can be observed with: + +.... +ls -l /dev/urandom +.... + +Output: + +.... +crw-rw-rw- 1 root root 1, 9 Jun 29 05:45 /dev/urandom +.... + +which means: + +* `c` (first letter): this is a character device. Would be `b` for a block device. +* `1, 9`: the major number is `1`, and the minor `9` + +To avoid device number conflicts when registring the driver we: + +* ask the kernel to allocate a free major number for us with: `register_chrdev(0` +* find ouf which number was assigned by grepping `/proc/devices` for the kernel module name + +Bibliography: https://unix.stackexchange.com/questions/37829/understanding-character-device-or-character-special-files/371758#371758 + +===== Automatically create character device file on insmod + +And also destroy it on `rmmod`: + +.... +/character_device_create.sh +echo $? +.... + +Outcome: the test passes: + +.... +0 +.... + +Sources: + +* link:kernel_module/character_device_create.c[] +* link:rootfs_overlay/character_device_create.sh[] + +Bibliography: https://stackoverflow.com/questions/5970595/how-to-create-a-device-node-from-the-init-module-code-of-a-linux-kernel-module/45531867#45531867 + === Kernel panic and oops To test out kernel panics and oops in controlled circumstances, try out the modules: diff --git a/kernel_module/README.adoc b/kernel_module/README.adoc index 190a7d2..389cff1 100644 --- a/kernel_module/README.adoc +++ b/kernel_module/README.adoc @@ -20,8 +20,6 @@ ... link:dep2.c[] . Pseudo filesystems .. link:anonymous_inode.c[] -.. link:character_device.c[] -.. link:character_device_create.c[] .. link:debugfs.c[] .. link:fops.c[] .. link:ioctl.c[] diff --git a/kernel_module/character_device.c b/kernel_module/character_device.c index a3d5f93..8a2049d 100644 --- a/kernel_module/character_device.c +++ b/kernel_module/character_device.c @@ -1,24 +1,3 @@ -/* -Allows us to create device files with given file operations with mknod c X. - -Usage: - - /character_device.sh - -The major number determines which module owns the device file. - -minor is to differentiate between multiple instances of the device, -e.g. two NVIDIA GPUs using the same kernel module. - -We ask the kernel to automatically allocate a major number for us to avoid -conlicts with other devices. - -Then we need to check /proc/devices to find out the assigned number, -and use that for the mknod. - -- https://unix.stackexchange.com/questions/37829/understanding-character-device-or-character-special-files/371758#371758 -*/ - #include /* register_chrdev, unregister_chrdev */ #include #include /* seq_read, seq_lseek, single_release */ diff --git a/kernel_module/character_device_create.c b/kernel_module/character_device_create.c index 937e1d9..bbd2b43 100644 --- a/kernel_module/character_device_create.c +++ b/kernel_module/character_device_create.c @@ -1,9 +1,3 @@ -/* -Automatically create the device under /dev on insmod, and remove on rmmod. - -https://stackoverflow.com/questions/5970595/how-to-create-a-device-node-from-the-init-module-code-of-a-linux-kernel-module/45531867#45531867 -*/ - #include #include #include /* register_chrdev, unregister_chrdev */ diff --git a/rootfs_overlay/character_device.sh b/rootfs_overlay/character_device.sh index 89b3e8b..e42a75d 100755 --- a/rootfs_overlay/character_device.sh +++ b/rootfs_overlay/character_device.sh @@ -1,5 +1,5 @@ #!/bin/sh -set -ex +set -e insmod /character_device.ko /mknoddev.sh lkmc_character_device [ "$(cat /dev/lkmc_character_device)" = 'abcd' ] diff --git a/rootfs_overlay/character_device_create.sh b/rootfs_overlay/character_device_create.sh index 5cc8354..2a9259b 100755 --- a/rootfs_overlay/character_device_create.sh +++ b/rootfs_overlay/character_device_create.sh @@ -1,7 +1,7 @@ #!/bin/sh -set -ex +set -e insmod /character_device_create.ko dev='/dev/lkmc_character_device_create_dev' -[ "$(cat "$dev")" = 'abcd' ] +[ "$(cat "$dev")" = abcd ] rmmod character_device_create [ ! -e "$dev" ]