实现功能:通过在虚拟机中建立设备文件/dev/mydev,进行字符设备的读写操作,并利用应用层显示出来。
1、新建驱动文件 driver.c
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
MODULE_LICENSE("GPL");
#define MAJOR_NUM 100
#define EFALUT 1
static ssize_t my_read(struct file * filp,char * buf, ssize_t size,loff_t * off);
static ssize_t my_write(struct file * flip,const char * buf,ssize_t size,loff_t *off);
struct file_operations my_ops = {
read: my_read,
write:my_write,
};
static int global_var=0;
static int __init my_init(void)
{
int ret;
ret=register_chrdev(MAJOR_NUM,"mydev",&my_ops);
if(ret)
printk("my dev register failer!\n");
else
printk("my dev register success!\n");
return ret;
}
static void __exit my_exit(void)
{
unregister_chrdev(MAJOR_NUM,"mydev");
}
{
if(copy_to_user(buf,&global_var,sizeof(int)))
{ return -EFALUT; }
return sizeof(int);
}
static ssize_t my_write(struct file * flip,const char * buf,ssize_t size,loff_t *off)
{
if(copy_from_user(&global_var,buf,sizeof(int)))
{ return -EFALUT; }
return sizeof(int);
}
module_init(my_init);
module_exit(my_exit);
obj-m := driver.o
PWD = $(shell pwd)
KDIR=/lib/modules/2.6.32-71.el6.i686/build/
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.o
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
void main()
{
int fd,num;
fd=open("/dev/mydev",O_RDWR,S_IRUSR|S_IWUSR);
if(fd!=-1)
{
read(fd,&num,sizeof(int));
printf("my read num is %d\n",num);
printf("please input a num:");
scanf("%d",&num);
write(fd,&num,sizeof(int));
read(fd,&num,sizeof(int));
printf("my read num is %d\n",num);
close(fd);
}
else
printf("open device failed!\n");
}
1、运行make,编译模块,并insmod加载到内核
2、编译应用层逻辑,运行。
3、得到结果: