]> git.feebdaed.xyz Git - linuxyz.git/commitdiff
user value
authorseantywork <seantywork@gmail.com>
Mon, 3 Nov 2025 07:01:52 +0000 (07:01 +0000)
committerseantywork <seantywork@gmail.com>
Mon, 3 Nov 2025 07:01:52 +0000 (07:01 +0000)
kuser-value/Makefile [new file with mode: 0644]
kuser-value/dev_check.sh [new file with mode: 0755]
kuser-value/dev_create.sh [new file with mode: 0755]
kuser-value/dev_destroy.sh [new file with mode: 0755]
kuser-value/user_value.c [new file with mode: 0644]

diff --git a/kuser-value/Makefile b/kuser-value/Makefile
new file mode 100644 (file)
index 0000000..99a74a4
--- /dev/null
@@ -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 (executable)
index 0000000..b807514
--- /dev/null
@@ -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 (executable)
index 0000000..fd48ae7
--- /dev/null
@@ -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 (executable)
index 0000000..aac6296
--- /dev/null
@@ -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 (file)
index 0000000..4ae7d58
--- /dev/null
@@ -0,0 +1,93 @@
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/uaccess.h> 
+
+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