diff options
author | Julian T <julian@jtle.dk> | 2020-02-11 12:24:56 +0100 |
---|---|---|
committer | Julian T <julian@jtle.dk> | 2020-02-11 12:24:56 +0100 |
commit | 6db1a2cdd3b96731f2e092d55d8c2136eabc52d0 (patch) | |
tree | 2be8fae8ce82d708ed9f00f376dda14420850e80 /sem3/osc/mm1 | |
parent | 57305119e05559c1c37e903aef89cd43f44c42c9 (diff) |
Rename and cleanup
Diffstat (limited to 'sem3/osc/mm1')
-rw-r--r-- | sem3/osc/mm1/.gitignore | 10 | ||||
-rw-r--r-- | sem3/osc/mm1/mm1/Makefile | 7 | ||||
-rw-r--r-- | sem3/osc/mm1/mm1/Readme.md | 34 | ||||
-rw-r--r-- | sem3/osc/mm1/mm1/jmod.c | 70 | ||||
-rw-r--r-- | sem3/osc/mm1/mm2/tprog.c | 71 |
5 files changed, 192 insertions, 0 deletions
diff --git a/sem3/osc/mm1/.gitignore b/sem3/osc/mm1/.gitignore new file mode 100644 index 0000000..b18a498 --- /dev/null +++ b/sem3/osc/mm1/.gitignore @@ -0,0 +1,10 @@ +jmod.ko +.jmod.ko.cmd +jmod.mod.c +jmod.mod.o +.jmod.mod.o.cmd +jmod.o +.jmod.o.cmd +modules.order +Module.symvers +.tmp_versions diff --git a/sem3/osc/mm1/mm1/Makefile b/sem3/osc/mm1/mm1/Makefile new file mode 100644 index 0000000..13c8e62 --- /dev/null +++ b/sem3/osc/mm1/mm1/Makefile @@ -0,0 +1,7 @@ +obj-m += jmod.o + +all: + make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean + diff --git a/sem3/osc/mm1/mm1/Readme.md b/sem3/osc/mm1/mm1/Readme.md new file mode 100644 index 0000000..fcc6cb3 --- /dev/null +++ b/sem3/osc/mm1/mm1/Readme.md @@ -0,0 +1,34 @@ +# Opgaver til operativ systemer + +Ligenu er det ikke delt op i mapper. + +## Kør mini kernel modul + +Compile med make. +Husk at peg makefile på din kernel modul mappe. +Denne er testet på ubuntu server 19.04. + +``` +make +``` + +Nu burde der være kommet et jmod.ko som kan loades med. + +``` +sudo insmod jmod.ko +``` + +Hvis du får permission denied kan du få flere information ved at checke `dmesg` loggen. + +Nu kan du hente major number ind fra dmesg. Led efter `COOL_MODULE:`. +Dette nummer bruger du til at assign den en node + +``` +sudo mknod /dev/cooldev c MAJOR 0 +``` + +Dette vil map kernel-modul/driver til cooldev i /dev/ mappen. +Husk at skriv til MAJOR nummer fra `dmesg` i stedet for MAJOR. + +Hvis man læser man pagen kan man se at det bliver lavet som en character unbuffered file. +MINOR nummeret er 0 da vores driver alligevel ikke bruger det til noget. diff --git a/sem3/osc/mm1/mm1/jmod.c b/sem3/osc/mm1/mm1/jmod.c new file mode 100644 index 0000000..a07077c --- /dev/null +++ b/sem3/osc/mm1/mm1/jmod.c @@ -0,0 +1,70 @@ +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/init.h> +#include <linux/fs.h> +#include <asm/uaccess.h> + +static int major_num; +static int busy; + + +static int cool_open(struct inode *inode, struct file *file) { + /* Check if we are already serving someone */ + if (busy) { + return -EBUSY; + } + + busy = 1; + return 0; +} + +static int cool_release (struct inode *inode, struct file *file) { + busy = 0; + + return 0; +} + +static ssize_t cool_read (struct file *filp, char *buffer, size_t len, loff_t *offset) { + + char str[12] = "hej med dig"; + int i; + + for (i = 0; i < len; i++) { + put_user(str[i % 12], buffer++); + } + + return i; +} + +static struct file_operations file_ops = { + .owner = THIS_MODULE, + .read = cool_read, + .open = cool_open, + .release = cool_release +}; + +static int __init jmod_init(void) +{ + printk(KERN_INFO "COOL_MODULE: Registering cooldev\n"); + + major_num = register_chrdev(0, "cooldev", &file_ops); + if (major_num < 0) { + printk(KERN_ERR "COOL_MODULE: Could not register major\n"); + return 1; + } + + printk(KERN_INFO "COOL_MODULE: Got major %d\n", major_num); + + return 0; +} + + +static void __exit jmod_exit(void) +{ + printk(KERN_INFO "COOL_MODULE: Nou moe\n"); + unregister_chrdev(major_num, "cooldev"); +} + +module_init( jmod_init ); +module_exit( jmod_exit ); + diff --git a/sem3/osc/mm1/mm2/tprog.c b/sem3/osc/mm1/mm2/tprog.c new file mode 100644 index 0000000..377555f --- /dev/null +++ b/sem3/osc/mm1/mm2/tprog.c @@ -0,0 +1,71 @@ +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/time.h> + +#define STARTSEC 10 +#define ENDUSEC 500000 +#define SPEED 0.8 + +struct itimerval timer; + +void timer_handler(int signum) { + /* Handy structure reference */ + struct timeval *tv = &timer.it_value; + printf("Hey we hit the alarm\n\a"); + + /* Calculate new alarm */ + tv->tv_sec *= SPEED; + if (tv->tv_sec == 0) { + /* If tv_usec is 0 set i to 1 sec otherwise half it */ + if (tv->tv_usec == 0) { + tv->tv_usec = 999999; + } else if (tv->tv_usec > ENDUSEC) { + tv->tv_usec *= SPEED; + if (tv->tv_usec < ENDUSEC) { + tv->tv_usec = ENDUSEC; + } + } else { + /* Return letting the timer be set to ENDUSEC */ + return; + } + } + + printf("Set to %d and %d\n", timer.it_value.tv_sec, timer.it_value.tv_usec); + /* Set alarm */ + int err = setitimer(ITIMER_REAL, &timer, NULL); + if (err) { + printf("Hey we got an error guys\n"); + exit(1); + } +} + +int main() { + /* Setup handler for timer */ + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); /* Remeber to set all fields to zero */ + + sa.sa_handler = &timer_handler; + sigaction(SIGALRM, &sa, NULL); + + /* Setup timer values */ + timer.it_value.tv_sec = STARTSEC; + timer.it_value.tv_usec = 0; + + timer.it_interval.tv_sec = 0; + timer.it_interval.tv_usec = ENDUSEC; + + /* Start the timer */ + setitimer(ITIMER_REAL, &timer, NULL); + + /* Select signals */ + sigset_t sigset; + sigemptyset(&sigset); + sigaddset(&sigset, SIGTERM); + + /* Wait for termination */ + sigwait(&sigset, NULL); + + return 0; +} |