skeleton.c


  1 #include <linux/init.h>
  2 #include <linux/kernel.h>
  3 #include <linux/module.h>
  4 #include <linux/fs.h>
  5 #include <asm/uaccess.h>
  6 #include <asm/io.h>
  7
  8 #define SK_MAJOR 240
  9
 10 int sk_open(struct inode *inode, struct file *filep)
 11 {
 12     printk("skeleton open\n");
 13     return 0;
 14 }
 15
 16 int sk_release(struct inode *inode, struct file *filp)
 17 {
 18     printk("skeleton release \n");
 19     return 0;
 20 }
 21
 22 ssize_t sk_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos)
 23 {
 24     char data[11];
 25     __copy_from_user(data, buf, count);
 26     printk("data is >>>> %s\n", data);
 27
 28     return count;
 29 }
 30 ssize_t sk_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
 31 {
 32     char data[30] = "this is read func...";
 33     __copy_to_user(buf, data, count);
 34                 // count 어플에서 넘어올 데이터의 크기
 35     return count;
 36 }
 37
 38 struct file_operations sk_fops = {
 39     .owner = THIS_MODULE,
 40     .open = sk_open,
 41     .release = sk_release,
 42     .write = sk_write,
 43     .read = sk_read,
 44 };
 45
 46 static int __init skeleton_init(void)
 47 {
 48     printk("skelelton module init\n");
 49     register_chrdev(SK_MAJOR, "SK", &sk_fops);
 50     return 0;
 51 }
 52
 53 static void __exit skeleton_exit(void)
 54 {
 55     printk("skeleton module exit\n");
 56     unregister_chrdev(SK_MAJOR, "SK");
 57 }
 58
 59 module_init(skeleton_init);
 60 module_exit(skeleton_exit);
 61
 62 MODULE_LICENSE("Dual BSD/GPL");



sk_app.c


  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 #include <fcntl.h>
  5
  6 int main()
  7 {
  8     int fd=0;
  9     int retn=0;
 10     //char buf[10] = "Write...";
 11     char buf[30] ={0};
 12
 13     fd = open("/dev/SK", O_RDWR);
 14
 15     printf("fd = %d\n", fd);
 16
 17     if(fd<0)
 18     {
 19         perror("/dev/SK");
 20         exit(-1);
 21     }
 22     else
 23         printf("SK has been detected...\n");
 24
 25     //retn = write(fd, buf, 10);
 26     retn = read(fd, buf, 30);
 27     printf("read data is %s\n", buf);
 28
 29     getchar();
 30     close(fd);
 31
 32     return 0;
 33 }




Makefile



  1 CC = gcc
  2 KDIR = /lib/modules/$(shell uname -r)/build
  3 PWD = $(shell pwd)
  4 TARGET = sk_app
  5
  6 obj-m = skeleton.o
  7
  8 build: $(TARGET)
  9     make -C $(KDIR) M=$(PWD) modules
 10
 11 $(TARGET):
 12     $(CC) -o $@ sk_app.c
 13
 14 clean:
 15     make -C $(KDIR) M=$(PWD) clean
 16     rm -f $(TARGET)



실행순서


1. skeleton.c 작성

2. sk_app.c 작성

3. Makefile 작성

4. insmod skeleton.ko

5. lsmod | grep skeleton

6. vi /proc/devices 에서 SK가 등록된지 확인 (240에 등록됨)

7. Device file

#mknod /dev/SK c 240 0

8. ./sk_app

9.rmmod skeleton










Posted by 차희빈

차희빈

달력