已经无法再精简,适合入门。
1 #include<linux/module.h>
2 #include<linux/init.h>
3
4 #include<asm/uaccess.h>
5 #include <linux/types.h>
6 #include<linux/fs.h>
7 #include<linux/cdev.h>
8 struct mengc_dev{
9 char data[64];
10 struct cdev cdev;
11 };
12 int mengmajor;
13 struct mengc_dev meng_device;
14
15 void exit_mengc_dev(void)
16 {
17 dev_t devno = MKDEV(mengmajor,1);
18 cdev_del(&meng_device.cdev);
19 unregister_chrdev_region(devno,1);
20 }
21 int meng_open(struct inode*inode,struct file *filep)
22 {
23 return 0;
24 }
25 int meng_release(struct inode*inode,struct file *filep)
26 {
27 return 0;
28 }
29
30 ssize_t meng_read(struct file*filep,char __user*buf,size_t count,loff_t*f_ops)
31 {
32 if(*f_ops>=strlen(meng_device.data))
33 return 0;
34 if(copy_to_user(buf,meng_device.data,strlen(meng_device.data)))
35 {
36 return -1;
37 }
38 *f_ops+=strlen(meng_device.data);
39 return strlen(meng_device.data);
40 }
41
42 ssize_t meng_write(struct file*filep,const char __user*buf,size_t count,loff_t*f_ops)
43 {
44 if(count>63)
45 count=63;
46 if(copy_from_user(meng_device.data,buf,count))
47 {
48 return -EFAULT;
49 }
50 return count;
51 }
52
53
54 struct file_operations meng_fops=
55 {
56 .read=meng_read,
57 .write=meng_write,
58 .open=meng_open,
59 .release=meng_release
60 };
61 int init_mengc_dev(void)
62 {
63 int re;
64 dev_t dev=0;
65 re=alloc_chrdev_region(&dev,1,1,"mengcdev");
66 if(re<0)
67 {
68 printk("meng_devc register failed.\n");
69 return re;
70 }
71 mengmajor=MAJOR(dev);
72 memset(&meng_device,0,sizeof(meng_device));
73 cdev_init(&meng_device.cdev,&meng_fops);
74 meng_device.cdev.owner=THIS_MODULE;
75 meng_device.cdev.ops=&meng_fops;
76 re=cdev_add(&meng_device.cdev,dev,1);
77 if(re)
78 {
79 printk("mengdevc add faild.\n");
80 }
81 return 0;
82 }
83 module_init(init_mengc_dev);
84 module_exit(exit_mengc_dev);
将上面的文件保存成mengcdev.c
然后在相同目录下建立一个Makefile文件,文件内容如下(只需这一行):
obj-m :=mengcdev.o
然后在此目录下执行 make -C /lib/modules/`uname
-r`/build/ M=`pwd` 这条命令执行成功的前天是安装了源代码包,具体可以参阅其他资料,Ubuntu只需apt-get install
几个包,Redhat系列只需yuminstall 几个。当然需要有开发环境了,即gcc之类的。
一旦编译完成即可生成mengcdev.ko 这个模块
用root插入这个模块
insmod mengcdev.ko
然后去/proc/device中找相应的设备号
cat /proc/devices |grep meng
如果输出如下:
248 mengcdev
则执行
mknod /dev/mengcdev c 248 1,注意把248换成实际输出的值
然后就可以进行测试了 echo hello >/dev/mengcdev
cat /dev/mengcdev
Linux 设备驱动程序 字符设备,布布扣,bubuko.com
时间: 2024-10-27 10:54:17