From 84d416fe77e421a773b31d3ded56a4016d77fbf3 Mon Sep 17 00:00:00 2001 From: seantywork Date: Thu, 20 Nov 2025 04:14:36 +0000 Subject: [PATCH] kproc --- kproc/Makefile | 2 +- kproc/kproc.c | 42 +++++++++++++++++++++--------------------- kproc/user/user.c | 28 +++++++++++++++++++++------- 3 files changed, 43 insertions(+), 29 deletions(-) diff --git a/kproc/Makefile b/kproc/Makefile index 57c0379..99b5844 100644 --- a/kproc/Makefile +++ b/kproc/Makefile @@ -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 diff --git a/kproc/kproc.c b/kproc/kproc.c index 0cd7a9d..5dcfdc5 100644 --- a/kproc/kproc.c +++ b/kproc/kproc.c @@ -11,16 +11,17 @@ #include #include -#include -#include +#include + #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"); } diff --git a/kproc/user/user.c b/kproc/user/user.c index e8486b7..19a0bd1 100644 --- a/kproc/user/user.c +++ b/kproc/user/user.c @@ -5,6 +5,8 @@ #include #include #include +#include +#include #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; -- 2.43.0