From: seantywork Date: Mon, 3 Nov 2025 07:01:52 +0000 (+0000) Subject: user value X-Git-Url: https://git.feebdaed.xyz/?a=commitdiff_plain;h=2967561ec28a2b52fc208a5f1a18aa3d70ea4c33;p=linuxyz.git user value --- diff --git a/kuser-value/Makefile b/kuser-value/Makefile new file mode 100644 index 0000000..99a74a4 --- /dev/null +++ b/kuser-value/Makefile @@ -0,0 +1,5 @@ +obj-m += user_value.o +all: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean \ No newline at end of file diff --git a/kuser-value/dev_check.sh b/kuser-value/dev_check.sh new file mode 100755 index 0000000..b807514 --- /dev/null +++ b/kuser-value/dev_check.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +echo "***** char dev result" + +cat /dev/user_value + +echo "*****" \ No newline at end of file diff --git a/kuser-value/dev_create.sh b/kuser-value/dev_create.sh new file mode 100755 index 0000000..fd48ae7 --- /dev/null +++ b/kuser-value/dev_create.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +sudo insmod ./user_value.ko +dev="user_value" +major="$(grep "$dev" /proc/devices | cut -d ' ' -f 1)" +sudo mknod "/dev/$dev" c "$major" 0 + +echo "dev node created" +echo "/dev/$dev" \ No newline at end of file diff --git a/kuser-value/dev_destroy.sh b/kuser-value/dev_destroy.sh new file mode 100755 index 0000000..aac6296 --- /dev/null +++ b/kuser-value/dev_destroy.sh @@ -0,0 +1,8 @@ +#!/bin/bash + + +sudo rm /dev/user_value +sudo rmmod user_value + + +echo "dev node destroyed" \ No newline at end of file diff --git a/kuser-value/user_value.c b/kuser-value/user_value.c new file mode 100644 index 0000000..4ae7d58 --- /dev/null +++ b/kuser-value/user_value.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include + +static int device_open(struct inode *, struct file *); +static int device_release(struct inode *, struct file *); +static ssize_t device_read(struct file *, char *, size_t, loff_t *); +static ssize_t device_write(struct file *, const char *, size_t, loff_t *); + +#define SUCCESS 0 +#define DEVICE_NAME "user_value" +#define BUF_LEN 80 + + +static int dev_major; +static int device_open_counter = 0; +static char msg[BUF_LEN]; +static char *msg_buff_ptr; + +static struct file_operations fops = { + .read = device_read, + .write = device_write, + .open = device_open, + .release = device_release +}; + + + +static int device_open(struct inode *inode, struct file *filp){ + static int counter = 0; + if (device_open_counter) + return -EBUSY; + device_open_counter++; + sprintf(msg, "counter: %d\n", counter++); + msg_buff_ptr = msg; + try_module_get(THIS_MODULE); + return SUCCESS; +} + + +static int device_release(struct inode *inode, struct file *filp){ + device_open_counter--; + module_put(THIS_MODULE); + return SUCCESS; +} + + +static ssize_t device_read(struct file *filp, + char *buffer, + size_t length, + loff_t *offset) +{ + + int bytes_read = 0; + if (*msg_buff_ptr == 0){ + return 0; + } + while (length && *msg_buff_ptr) { + put_user(*(msg_buff_ptr++), buffer++); + length--; + bytes_read++; + } + return bytes_read; +} + + +static ssize_t device_write(struct file *filp, const char *buf, size_t len, loff_t *off){ + printk(KERN_ALERT "operation not supported.\n"); + return -EINVAL; +} + +static int __init init_user_value(void){ + dev_major = register_chrdev(0, DEVICE_NAME, &fops); + + if (dev_major < 0) { + printk(KERN_ALERT "registering char device failed with %d\n", dev_major); + return dev_major; + } + printk(KERN_INFO "dev_major number: %d\n", dev_major); + + return SUCCESS; +} + + +static void __exit exit_user_value(void){ + unregister_chrdev(dev_major, DEVICE_NAME); +} + +module_init(init_user_value); +module_exit(exit_user_value); +MODULE_LICENSE("GPL"); \ No newline at end of file