33,311
社区成员
发帖
与我相关
我的任务
分享
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linuc/fs.h>
#include <linux/string.h>
#include <linux/uaccess.h>
#include <linux/slab.h>
#include <linux/device.h>
MODULE_LICENSE("GPL");
static int major = 0;
static char *memdev; //用来接收用户空间发来的信息
static struct class *myclass;
//从内核读到用户空间
static ssize_t myread (struct file *filp, char __user *ubuf,
size_t size, loff_t *offset)
{
copy_to_user(ubuf, memdev, strlen(memdev));//将memdev中的数据通过ubuf传给用户空间
return strlen(memdev);
}
//从用户空间写到内核空间
static ssize_t mywrite (struct file *filp, const char __user *ubuf,
size_t size, loff_t *offset)
{
memset(memdev,0,4096);
copy_from_user(memdev, ubuf, size); //将用户空间中的数据通过ubuf传递给memdev
return size;
}
static int myopen (struct inode *inodep, struct file *filp)
{
printk("myopen have been called\n");
return 0;
}
static int myclose (struct inode *inodep, struct file *filp)
{
printk("myclose have been called\n");
return 0;
}
static struct file_operations my_fops=
{
.owner = THIS_MODULE, //在此模块运行时不能被卸载,以下四个分别调用上述对应函数
.read = myread,
.write = mywrite,
.open = myopen,
.release = myclose,
};
static int __init mychar_init(void)
{
major = register_chrdev(0, "mychar", &my_fops); //用本函数创建主设备号
//在内核中为本驱动程序开辟一段空间,并自动将这片区域清空
memdev = kzalloc(4096,GFP_KERNEL);
//调用udev自动创建设备节点,且在此目录下:sys/class/name
myclass = class_create(THIS_MODULE, "myclass");
//文件节点在此处dev/mychardev
device_create(myclass, NULL, MKDEV(major, 0), NULL, "mychrdev");
return 0;
}
static void __exit mychar_exit(void)
{
kfree(memdev);
unregister_chrdev(major, "mychar");
}
module_init(mychar_init);
module_exit(mychar_exit);
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/string.h>
#include <linux/uaccess.h>
#include <linux/slab.h>
#include <linux/device.h>
#include <linux/cdev.h>
MODULE_LICENSE("GPL");
static int major = 0;
static struct cdev mycdev;
static char *memsev;
static struct class *myclass;
static ssize_t myread (struct file *filp, char __user *ubuf, size_t size, loff_t *offset)
{
copy_to_user(ubuf, memdev, strlen(memdev));
return strlen(memdev);
}
static ssize_t mywrite (struct file *filp, const char __user *ubuf, size_t size, loff_t *offset)
{
memset(memdev,0,4096);
copy_from_user(memdev, ubuf, size);
return size;
}
static int myopen (struct inode *inodep, struct file *filp)
{
printk("myopen have been called\n");
return 0;
}
static int myclose (struct inode *inodep, struct file *filp)
{
printk("myclose have been called\n");
return 0;
}
static struct file_operations my_fops=
{
.owner = THIS_MODULE,
.read = myread,
.write = mywrite,
.open = myopen,
.release = myclose,
};
static int __init mycdev_init(void)
{
dev_t dev; //字符设备文件
if(major)//静态注册
{
register_chrdev_region(MKDEV(major, 0), 1, "mycdev");
}
else //动态注册
{
alloc_chrdev_region(&dev, 0, 1, "mycdev");
major = MAJOR(dev);
}
cdev_init(&mycdev, &my_fops); //初始化dev
cdev_add(&mycdev, MKDEV(major, 0), 1); //注册驱动程序,并将其添加到内核中
memdev = kzalloc(4096, GFP_ATOMIC);
myclass = class_create(THIS_MODULE, "myclass");
device_create(myclass, NULL, MKDEV(major, 0), NULL, "mycdev");
return 0;
}
static void mycdev_exit(void)
{
kfree(memdev);
cdev_del(&mycdev);
unregister_chrdev_region(MKDEV(major, 0), 1);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int fd;
char buf[256] = {0};
fd = open("/dev/mychrdev",O_RDWR);
if(fd < 0)
{
perror("open");
exit(1);
}
write(fd,"hello,kernel!",strlen("hello,kernel!"));
read(fd,buf,256);
printf("%s\n",buf);
close(fd);
return 0;
}