Forskelle
Dette viser forskellene mellem den valgte og den nuværende udgave af dokumentet. Gul er linjer der findes i den gamle udgave, og grøn er linjer der findes i den nuværende.
— |
diverse:fkernelmodul:v2025 [06-03-2025 18:47] (nuværende) tjen19 oprettet |
||
---|---|---|---|
Linje 1: | Linje 1: | ||
+ | grundet uforsvarlige ændringer i linux kernen gennem de få 20 år siden [[diverse:fkernelmodul|]] blev skabt, er følgende diff nødvendig: | ||
+ | <code diff> | ||
+ | diff --git a/f-kernel.c b/f-kernel.c | ||
+ | index be62e81..d7e2d7f 100644 | ||
+ | --- a/f-kernel.c | ||
+ | +++ b/f-kernel.c | ||
+ | @@ -1,6 +1,7 @@ | ||
+ | #include <linux/kernel.h> | ||
+ | #include <linux/module.h> | ||
+ | #include <linux/fs.h> | ||
+ | +#include <linux/uaccess.h> | ||
+ | |||
+ | #define MAX_Fs 99999 //-1 for infinitet | ||
+ | |||
+ | @@ -20,9 +21,11 @@ static int device_close(struct inode *i, struct file *f) | ||
+ | } | ||
+ | |||
+ | static ssize_t device_read( | ||
+ | - struct file *f, char *buffer, size_t length, loff_t *offset) | ||
+ | + struct file *f, char __user *buffer, size_t length, loff_t *offset) | ||
+ | { | ||
+ | - *buffer = 'F'; | ||
+ | + char F = 'F'; | ||
+ | + copy_to_user(buffer, &F, 1); | ||
+ | + | ||
+ | fCount++; | ||
+ | |||
+ | if (fCount != -1 && fCount >= MAX_Fs){ | ||
+ | @@ -33,12 +36,15 @@ static ssize_t device_read( | ||
+ | } | ||
+ | |||
+ | static ssize_t device_write( | ||
+ | - struct file *f, const char *buffer, size_t length, loff_t *offset) | ||
+ | + struct file *f, const char __user *buffer, size_t length, loff_t *offset) | ||
+ | { | ||
+ | - if (*buffer = 'F' || *buffer = 'f'){ | ||
+ | + char buf; | ||
+ | + copy_from_user(&buf, buffer, 1); | ||
+ | + | ||
+ | + if (buf == 'F' || buf == 'f'){ | ||
+ | fCount--; | ||
+ | }else{ | ||
+ | - panic("My world only contains F!!! ") | ||
+ | + panic("My world only contains F!!! "); | ||
+ | } | ||
+ | return length; | ||
+ | } | ||
+ | @@ -67,11 +73,11 @@ static int device_init(void) | ||
+ | |||
+ | static void device_exit(void) | ||
+ | { | ||
+ | - int n = unregister_chrdev(major, "null device"); | ||
+ | - if (n < 0) | ||
+ | - { | ||
+ | - printk("Cleanup failed (%d)\n", n); | ||
+ | - } | ||
+ | + unregister_chrdev(major, "null device"); | ||
+ | + //if (n < 0) | ||
+ | + //{ | ||
+ | + // printk("Cleanup failed (%d)\n", n); | ||
+ | + //} | ||
+ | } | ||
+ | |||
+ | module_init(device_init); | ||
+ | </code> |