已经无法再精简,适合入门。
#include<linux/module.h>
#include<linux/init.h> #include<asm/uaccess.h>
#include <linux/types.h>
#include<linux/fs.h>
#include<linux/cdev.h>
struct mengc_dev{
char data[];
struct cdev cdev;
};
int mengmajor;
struct mengc_dev meng_device; void exit_mengc_dev(void)
{
dev_t devno = MKDEV(mengmajor,);
cdev_del(&meng_device.cdev);
unregister_chrdev_region(devno,);
}
int meng_open(struct inode*inode,struct file *filep)
{
return ;
}
int meng_release(struct inode*inode,struct file *filep)
{
return ;
} ssize_t meng_read(struct file*filep,char __user*buf,size_t count,loff_t*f_ops)
{
if(*f_ops>=strlen(meng_device.data))
return ;
if(copy_to_user(buf,meng_device.data,strlen(meng_device.data)))
{
return -;
}
*f_ops+=strlen(meng_device.data);
return strlen(meng_device.data);
} ssize_t meng_write(struct file*filep,const char __user*buf,size_t count,loff_t*f_ops)
{
if(count>)
count=;
if(copy_from_user(meng_device.data,buf,count))
{
return -EFAULT;
}
return count;
} struct file_operations meng_fops=
{
.read=meng_read,
.write=meng_write,
.open=meng_open,
.release=meng_release
};
int init_mengc_dev(void)
{
int re;
dev_t dev=;
re=alloc_chrdev_region(&dev,,,"mengcdev");
if(re<)
{
printk("meng_devc register failed.\n");
return re;
}
mengmajor=MAJOR(dev);
memset(&meng_device,,sizeof(meng_device));
cdev_init(&meng_device.cdev,&meng_fops);
meng_device.cdev.owner=THIS_MODULE;
meng_device.cdev.ops=&meng_fops;
re=cdev_add(&meng_device.cdev,dev,);
if(re)
{
printk("mengdevc add faild.\n");
}
return ;
}
module_init(init_mengc_dev);
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