kernel-helloworld-test

view ktestmodule/ktest.c @ 0:dbbd63da261f

helloworld kernel module and program that reads the /dev/ktest
author Eleni Maria Stea <eleni@mutantstargoat.com>
date Wed, 10 May 2017 13:11:31 +0300
parents
children
line source
1 #include <asm/uaccess.h>
2 #include <linux/fs.h>
3 #include <linux/kernel.h>
4 #include <linux/module.h>
5 #include <linux/slab.h>
7 #define DEV_NAME "ktest"
9 static int ktest_init(void);
10 static void ktest_fini(void);
12 static int ktest_open(struct inode *inode, struct file *file);
13 static int ktest_release(struct inode *inode, struct file *file);
14 static ssize_t ktest_read(struct file *file, char *buf, size_t buf_size,
15 loff_t *offset);
17 static int dev_num;
18 static struct file_operations ops = {
19 .open = ktest_open,
20 .release = ktest_release,
21 .read = ktest_read
22 };
23 static int hello_counter;
25 /* macros */
27 MODULE_LICENSE("GPL");
28 MODULE_AUTHOR("hikiko");
29 MODULE_DESCRIPTION("my kernel helloworld");
31 module_init(ktest_init);
32 module_exit(ktest_fini);
34 static int ktest_init(void)
35 {
36 hello_counter = 0;
38 /* register character device */
39 if((dev_num = register_chrdev(0, DEV_NAME, &ops)) < 0) {
40 printk(KERN_ALERT "Failed to register character device.\n");
41 return -1;
42 }
43 printk(KERN_INFO "Registered character device. Name: %s number: %d.\n", DEV_NAME, dev_num);
44 return 0;
45 }
47 static void ktest_fini(void)
48 {
49 unregister_chrdev(dev_num, DEV_NAME);
50 printk(KERN_INFO "Unregistered character device. Name: %s number: %d.\n", DEV_NAME, dev_num);
51 }
53 static int ktest_open(struct inode *inode, struct file *file)
54 {
55 /* 1 device file only => we ignore the params ^ */
56 try_module_get(THIS_MODULE);
57 return 0;
58 }
60 static int ktest_release(struct inode *inode, struct file *file)
61 {
62 module_put(THIS_MODULE);
63 return 0;
64 }
66 static ssize_t ktest_read(struct file *file, char *buf, size_t buf_size,
67 loff_t *offset)
68 {
69 /* buf = userspace buffer,
70 * kbuf = kernel buffer */
72 char *kbuf;
73 int bytes;
75 if(!(kbuf = kmalloc(buf_size, GFP_KERNEL))) {
76 printk(KERN_ALERT "Failed to allocate memory.\n");
77 return -ENOMEM;
78 }
80 /* fill kbuf and copy to userspace buf */
81 bytes = snprintf(kbuf, buf_size, "Hello world, num: %d.\n", ++hello_counter);
83 if(copy_to_user(buf, kbuf, bytes))
84 {
85 kfree(kbuf);
86 return -EFAULT;
87 }
89 kfree(kbuf);
90 return bytes;
91 }