From 26fd7b145e715a00c7f0f97d8674b43e4ea94890 Mon Sep 17 00:00:00 2001 From: seantywork Date: Wed, 5 Nov 2025 04:24:13 +0000 Subject: [PATCH] chr store --- kchr-store/2025-1105.xyz.md | 1 + kchr-store/Makefile | 5 +++ .../mem_storage.c => kchr-store/chr_store.c | 37 +++++++++++++++---- {kmem-storage => kchr-store}/dev_create.sh | 4 +- kchr-store/dev_destroy.sh | 7 ++++ {kmem-storage => kchr-store}/user/Makefile | 0 {kmem-storage => kchr-store}/user/u.c | 25 ++++++++++++- kmem-storage/Makefile | 5 --- kmem-storage/dev_destroy.sh | 7 ---- 9 files changed, 68 insertions(+), 23 deletions(-) create mode 100644 kchr-store/2025-1105.xyz.md create mode 100644 kchr-store/Makefile rename kmem-storage/mem_storage.c => kchr-store/chr_store.c (79%) rename {kmem-storage => kchr-store}/dev_create.sh (74%) create mode 100755 kchr-store/dev_destroy.sh rename {kmem-storage => kchr-store}/user/Makefile (100%) rename {kmem-storage => kchr-store}/user/u.c (60%) delete mode 100644 kmem-storage/Makefile delete mode 100755 kmem-storage/dev_destroy.sh diff --git a/kchr-store/2025-1105.xyz.md b/kchr-store/2025-1105.xyz.md new file mode 100644 index 0000000..4e768b5 --- /dev/null +++ b/kchr-store/2025-1105.xyz.md @@ -0,0 +1 @@ +# \ No newline at end of file diff --git a/kchr-store/Makefile b/kchr-store/Makefile new file mode 100644 index 0000000..f417896 --- /dev/null +++ b/kchr-store/Makefile @@ -0,0 +1,5 @@ +obj-m += chr_store.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/kmem-storage/mem_storage.c b/kchr-store/chr_store.c similarity index 79% rename from kmem-storage/mem_storage.c rename to kchr-store/chr_store.c index 459daa6..103f3a8 100644 --- a/kmem-storage/mem_storage.c +++ b/kchr-store/chr_store.c @@ -8,7 +8,7 @@ #include #define SUCCESS 0 -#define DEVICE_NAME "mem_storage" +#define DEVICE_NAME "chr_store" #define MAX_LEN 256 #define BLK_LEN 4096 @@ -37,7 +37,7 @@ 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){ int _blk_count = 0; ssize_t n = 0; - printk(KERN_INFO "mst: r length: %lu\n", len); + printk(KERN_INFO "chr_store: r length: %lu\n", len); if (blk_count == 0){ return 0; } @@ -59,7 +59,7 @@ static ssize_t device_write(struct file *filp, const char *buf, size_t len, loff int _blk_count = 0; ssize_t n = 0; - printk(KERN_INFO "mst: w length: %lu\n", len); + printk(KERN_INFO "chr_store: w length: %lu\n", len); _blk_count = len / BLK_LEN; if(len % BLK_LEN != 0){ _blk_count += 1; @@ -94,8 +94,31 @@ static ssize_t device_write(struct file *filp, const char *buf, size_t len, loff return len - n; } +static loff_t device_llseek(struct file* filp, loff_t offset, int whence){ + + loff_t retval = 0; + if(blk_count == 0){ + return 0; + } + switch(whence){ + case SEEK_END: + retval = strlen(msg); + break; + case SEEK_SET: + retval = 0; + break; + default: + retval = 0; + break; + } + return retval; +} + + + static struct file_operations fops = { + .llseek = device_llseek, .read = device_read, .write = device_write, .open = device_open, @@ -103,7 +126,7 @@ static struct file_operations fops = { }; -static int __init init_mem_storage(void){ +static int __init init_chr_store(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); @@ -114,7 +137,7 @@ static int __init init_mem_storage(void){ } -static void __exit exit_mem_storage(void){ +static void __exit exit_chr_store(void){ unregister_chrdev(dev_major, DEVICE_NAME); if(msg != NULL){ kfree(msg); @@ -122,6 +145,6 @@ static void __exit exit_mem_storage(void){ printk(KERN_INFO "dev_major: %d: gone\n", dev_major); } -module_init(init_mem_storage); -module_exit(exit_mem_storage); +module_init(init_chr_store); +module_exit(exit_chr_store); MODULE_LICENSE("GPL"); \ No newline at end of file diff --git a/kmem-storage/dev_create.sh b/kchr-store/dev_create.sh similarity index 74% rename from kmem-storage/dev_create.sh rename to kchr-store/dev_create.sh index f5602e4..090de35 100755 --- a/kmem-storage/dev_create.sh +++ b/kchr-store/dev_create.sh @@ -1,7 +1,7 @@ #!/bin/bash -sudo insmod ./mem_storage.ko -dev="mem_storage" +sudo insmod ./chr_store.ko +dev="chr_store" major="$(grep "$dev" /proc/devices | cut -d ' ' -f 1)" #sudo mknod "/dev/$dev" c "$major" 0 sudo mknod "./user/$dev" c "$major" 0 diff --git a/kchr-store/dev_destroy.sh b/kchr-store/dev_destroy.sh new file mode 100755 index 0000000..faa87c3 --- /dev/null +++ b/kchr-store/dev_destroy.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +sudo rm ./user/chr_store +sudo rmmod chr_store + + +echo "dev node destroyed" \ No newline at end of file diff --git a/kmem-storage/user/Makefile b/kchr-store/user/Makefile similarity index 100% rename from kmem-storage/user/Makefile rename to kchr-store/user/Makefile diff --git a/kmem-storage/user/u.c b/kchr-store/user/u.c similarity index 60% rename from kmem-storage/user/u.c rename to kchr-store/user/u.c index 6675dd9..1e8a866 100644 --- a/kmem-storage/user/u.c +++ b/kchr-store/user/u.c @@ -2,7 +2,7 @@ #include #include -#define DEV_NAME "./mem_storage" +#define DEV_NAME "./chr_store" void print_help(){ printf("r $number: reads $number of characters from the beginning\n"); @@ -24,8 +24,28 @@ int main(int argc, char** argv){ return -1; } if(strcmp(argv[1], "r") == 0){ + long fsize = 0; sscanf(argv[2], "%d", &number); - buff = calloc(number, sizeof(char)); + if(fseek(f, 0L, SEEK_END) == 0){ + fsize = ftell(f); + if(fsize < 0){ + printf("failed to seek size\n"); + goto out; + } + if(fseek(f, 0L, SEEK_SET) != 0){ + printf("failed to reset pos\n"); + goto out; + } + } else { + printf("failed to seek eof\n"); + goto out; + } + if(fsize == 0){ + printf("nothing to read\n"); + return 0; + } + printf("current chr_storage size: %ld\n", fsize); + buff = calloc(fsize, sizeof(char)); int n = fread(buff, sizeof(char), number, f); printf("read: %d: %s\n", n, buff); free(buff); @@ -38,6 +58,7 @@ int main(int argc, char** argv){ print_help(); return -1; } +out: fclose(f); return 0; diff --git a/kmem-storage/Makefile b/kmem-storage/Makefile deleted file mode 100644 index 7dcb971..0000000 --- a/kmem-storage/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -obj-m += mem_storage.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/kmem-storage/dev_destroy.sh b/kmem-storage/dev_destroy.sh deleted file mode 100755 index 8bf452c..0000000 --- a/kmem-storage/dev_destroy.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -sudo rm ./user/mem_storage -sudo rmmod mem_storage - - -echo "dev node destroyed" \ No newline at end of file -- 2.43.0