]> git.feebdaed.xyz Git - linuxyz.git/commitdiff
kproc
authorseantywork <seantywork@gmail.com>
Thu, 20 Nov 2025 04:14:36 +0000 (04:14 +0000)
committerseantywork <seantywork@gmail.com>
Thu, 20 Nov 2025 04:14:36 +0000 (04:14 +0000)
kproc/Makefile
kproc/kproc.c
kproc/user/user.c

index 57c0379f78ff9ce177c1340f8489c3d3f2930c54..99b5844f3d01c5f7a6ff9af1b15642521549c0f9 100644 (file)
@@ -4,5 +4,5 @@ all:
        make -C user
        make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
 clean:
-       make -C user
+       make -C user clean
        make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean
\ No newline at end of file
index 0cd7a9dfd6f4bb4ee333772e63628fb8b9da309e..5dcfdc5c3daafa99d4e32363363170159afad23e 100644 (file)
 #include <linux/fs.h>
 #include <linux/uaccess.h> 
 
-#include <linux/delay.h>
-#include <linux/workqueue.h>
+#include <linux/interrupt.h>
+
 
 #include "kproc.h"
 
-static struct work_struct job;
+#define IRQ_1 1
+#define IRQ_1_DEV "irq_1_dev"
+#define IRQ_1_ID "0001"
 
 static int dev_major;
 static int device_open_counter = 0;
-static int work_done = 0;
 
 static void show_proc_context(char* buf){
     unsigned int uid;
@@ -54,8 +55,8 @@ static int device_release(struct inode *inode, struct file *filp){
 static ssize_t device_read(struct file *filp, char *buffer, size_t len, loff_t *offset){
     char tmp_msg_buffer[KPROC_BUFF_LEN] = {0};
     show_proc_context(tmp_msg_buffer);
-    ssize_t n = copy_to_user(buffer, tmp_msg_buffer, len);
-    (*offset) += len;
+    ssize_t n = copy_to_user(buffer, tmp_msg_buffer, KPROC_BUFF_LEN);
+    (*offset) += KPROC_BUFF_LEN;
     return KPROC_BUFF_LEN - n;
 }
 
@@ -64,18 +65,17 @@ static ssize_t device_write(struct file *filp, const char *buf, size_t len, loff
     return -EINVAL;
 }
 
-static void job_handler(struct work_struct* work){
-    printk("kproc: job scheduled\n");
-    char tmp_msg_buffer[KPROC_BUFF_LEN] = {0};
-    while(!work_done){
-        show_proc_context(tmp_msg_buffer);
-        printk("kproc: job: %s\n", tmp_msg_buffer);
-        memset(tmp_msg_buffer, 0, KPROC_BUFF_LEN);
-        msleep(3000);
-    }
-    printk("kproc: job done\n");
+
+char tmp_msg_buffer[KPROC_BUFF_LEN] = {0};
+
+static irq_handler_t irq_1_handler(unsigned int irq, void* dev_id, struct pt_regs *regs){
+    show_proc_context(tmp_msg_buffer);
+    printk("kproc: isr: %s\n", tmp_msg_buffer);
+    memset(tmp_msg_buffer, 0, KPROC_BUFF_LEN);
+    return (irq_handler_t)IRQ_HANDLED;
 }
 
+
 static struct file_operations fops = {
   .read = device_read,
   .write = device_write,
@@ -84,21 +84,21 @@ static struct file_operations fops = {
 };
 
 static int __init kproc_init(void){
+    if (request_irq(IRQ_1, (irq_handler_t)irq_1_handler, IRQF_SHARED, IRQ_1_DEV, IRQ_1_ID) != 0){
+        printk("can't request interrupt number %d\n", IRQ_1);
+    }
     dev_major = register_chrdev(0, DEVICE_NAME, &fops);
     if (dev_major < 0) {
+        free_irq(IRQ_1, IRQ_1_ID);
         printk(KERN_ALERT "registering char device failed with %d\n", dev_major);
         return dev_major;
     }
-    INIT_WORK(&job, job_handler);
-    schedule_work(&job);
     printk("kproc: hello\n");
     return 0;
 }
 
 static void __exit kproc_exit(void){
-    work_done = 1;
-    printk("kproc: exit: waiting 5 seconds\n");
-    msleep(5000);
+    free_irq(IRQ_1, IRQ_1_ID);
     unregister_chrdev(dev_major, DEVICE_NAME);
     printk("kproc: bye\n");
 }
index e8486b72c6d1a510c89e9b752342f2378bd1ef10..19a0bd1435fcf7813617fe30aaaf23158895ef52 100644 (file)
@@ -5,6 +5,8 @@
 #include <signal.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <sys/stat.h>
+#include <sys/sysmacros.h>
 
 #include "kproc.h"
 
@@ -18,9 +20,13 @@ void sig_hdl(int sig){
 }
 
 void* another_thread(void* varg){
+    char fbuf[1024] = {0};
+    int n = 0;
     while(keepalive){
         pthread_mutex_lock(&mut);
-
+        n = fread(fbuf, sizeof(char), 1024, fp);
+        printf("thread: %s\n", fbuf);
+        memset(fbuf, 0, 1024);
         pthread_mutex_unlock(&mut);
         sleep(1);
     }
@@ -42,21 +48,26 @@ int main(int argc, char** argv){
     printf("devices:\n");
     while(fgets(fbuf, 1024, fp)){
         printf("%s", fbuf);
-        if((tbuf = strstr(fbuf, "loop")) != NULL){
+        if((tbuf = strstr(fbuf, DEVICE_NAME)) != NULL){
             tbuf -= 1;
             *tbuf = 0;
             tbuf -= 3;
-            printf("target major: %s\n", tbuf);
+            sscanf(tbuf, "%d", &major);
+            printf("target major: %d\n", major);
             break;
         }
         memset(fbuf, 0, 1024 * sizeof(char));
     }
     fclose(fp);
-    if(result < 0){
+    if(major < 0){
         printf("target not found\n");
         return -1;
     }
-    result = -1;
+    result = mknodat(AT_FDCWD, DEVICE_NODNAME, 0666 | S_IFCHR, makedev(major, 0));
+    if(result != 0){
+        printf("mknod failed\n");
+        return -1;
+    }
     signal(SIGINT, sig_hdl);
     fp = fopen(DEVICE_NODNAME, "r+");
     if(fp == NULL){
@@ -69,13 +80,16 @@ int main(int argc, char** argv){
         printf("failed to create thread\n");
         return -1;
     }
+    memset(fbuf, 0, 1024);
     while(keepalive){
         pthread_mutex_lock(&mut);
-
-
+        int n = fread(fbuf, sizeof(char), 1024, fp);
+        printf("main: %s\n", fbuf);
+        memset(fbuf, 0, 1024);
         pthread_mutex_unlock(&mut);
         sleep(1);
     }
+    remove(DEVICE_NODNAME);
     fclose(fp);
 
     return 0;