ubuntu增加字符設備驅動程序/ 操作系統課程設計


【這里使用的核心是4.14版本的】

1.創建驅動程序源文件Driver.c 

 1 #include "linux/kernel.h"
 2 #include "linux/module.h"
 3 #include "linux/fs.h"
 4 #include "linux/init.h"
 5 #include "linux/types.h"
 6 #include "linux/errno.h"
 7 #include "linux/uaccess.h"
 8 #include "linux/kdev_t.h"
 9  
10 #define MAX_SIZE 1024
11  
12 int my_open(struct inode *inode, struct file *file);
13 int my_release(struct inode *inode, struct file *file);
14 ssize_t my_read(struct file *file, char __user *user, size_t t, loff_t *f);
15 ssize_t my_write(struct file *file, const char __user *user, size_t t, loff_t *f);
16  
17 char message[MAX_SIZE] = "this is arafat(very shuai boy)'s Drive";  //打開設備時會顯示的消息
18 int device_num;//設備號
19 char* devName = "Driver";//設備名
20  
21 struct file_operations pStruct =
22 { 
23     open:my_open, 
24     release:my_release, 
25     read:my_read, 
26     write:my_write, 
27 };
28  
29 /* 注冊 */
30 int init_module()
31 {
32     int ret;
33  
34     ret = register_chrdev(0, devName, &pStruct);
35     if (ret < 0)
36     {
37         printk("failed to register_chrdev.\n");
38         return -1;
39     }
40     else
41     {
42         printk("the lgsDrive has been registered!\n");
43         printk("id: %d\n", ret);
44         device_num = ret;
45  
46         return 0;
47     }
48 }
49  
50 //注銷
51 void cleanup_module()
52 {
53     unregister_chrdev(device_num, devName);
54     printk("unregister successful.\n");
55 }
56  
57  
58 //打開
59 int my_open(struct inode *inode, struct file *file)
60 {
61     printk("open lgsDrive OK!\n");
62     try_module_get(THIS_MODULE);
63     return 0;
64 }
65  
66 //關閉
67 int my_release(struct inode *inode, struct file *file)
68 {
69     printk("Device released!\n");
70     module_put(THIS_MODULE);
71  
72     return 0;
73 }
74  
75  
76 //讀設備里的信息
77 ssize_t my_read(struct file *file, char __user *user, size_t t, loff_t *f)
78 {
79     if(copy_to_user(user,message,sizeof(message)))
80     {
81         return -2;
82     }
83     return sizeof(message);
84 }
85  
86 //向設備里寫信息
87 ssize_t my_write(struct file *file, const char __user *user, size_t t, loff_t *f)
88 {
89     if(copy_from_user(message,user,sizeof(message)))
90     {
91         return -3;
92     }
93     return sizeof(message);
94 }

2.同目錄創建Makefile

 1 obj-m := Driver.o    #這里是上面所創建的c文件名.o
 2     PWD := $(shell pwd)
 3     KERNELDIR := /usr/src/linux-4.14   #你要安裝mod的內核版本 
 4 all:
 5     make -C $(KERNELDIR) M=$(PWD) modules
 6  
 7  
 8 .PHONY: clean
 9 clean:
10     rm -rf *.o *~ core *.ko *.mod.c modules.order Module.symvers

3.切換到root 權限

  make

  insmod Driver.ko【文件名是上面用的】 安裝模塊

4.增加自己的模塊

  mknod /dev/Driver c 243 0    //243為設備號  Driver是設備名

到這里就結束了 可以寫個程序來驗證自己程序正確性

 5.移除模塊

  rm /dev/Driver

  rmmod Driver


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM