完整的globalvar.c文件源代码如下:
#i nclude <linux/module.h> #i nclude <linux/init.h> #i nclude <linux/fs.h> #i nclude <asm/uaccess.h> module_license("gpl");
#define major_num 254 //主设备号
static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*); static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*);
//初始化字符设备驱动的file_operations结构体 struct file_operations globalvar_fops = { read: globalvar_read, write: globalvar_write, }; static int global_var = 0; //"globalvar"设备的全局变量
static int __init globalvar_init(void) { int ret;
//注册设备驱动 ret = register_chrdev(major_num, "globalvar", &globalvar_fops); if (ret) { printk("globalvar register failure"); } else { printk("globalvar register success"); } return ret; }
static void __exit globalvar_exit(void) { int ret;
//注销设备驱动 ret = unregister_chrdev(major_num, "globalvar"); if (ret) { printk("globalvar unregister failure"); } else { printk("globalvar unregister success"); } }
static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off) { //将global_var从内核空间复制到用户空间 if (copy_to_user(buf, &global_var, sizeof(int))) { return - efault; } return sizeof(int); }
static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off) { //将用户空间的数据复制到内核空间的global_var if (copy_from_user(&global_var, buf, sizeof(int))) { return - efault; } return sizeof(int); }
module_init(globalvar_init); module_exit(globalvar_exit); | 运行:
| gcc -d__kernel__ -dmodule -dlinux -i /usr/local/src/linux2.4/include -c -o globalvar.o globalvar.c | 编译代码,运行:
加载globalvar模块,再运行:
发现其中多出了"254 globalvar"一行,如下图:
接着我们可以运行:
| mknod /dev/globalvar c 254 0 | 创建设备节点,用户进程通过/dev/globalvar这个路径就可以访问到这个全局变量虚拟设备了。我们写一个用户态的程序globalvartest.c来验证上述设备:
#i nclude <sys/types.h> #i nclude <sys/stat.h> #i nclude <stdio.h> #i nclude <fcntl.h> main() { int fd, num; //打开"/dev/globalvar" fd = open("/dev/globalvar", o_rdwr, s_irusr | s_iwusr); if (fd != -1 ) { //初次读globalvar read(fd, &num, sizeof(int)); printf("the globalvar is %d\n", num);
//写globalvar printf("please input the num written to globalvar\n"); scanf("%d", &num); write(fd, &num, sizeof(int));
//再次读globalvar read(fd, &num, sizeof(int)); printf("the globalvar is %d\n", num);
//关闭"/dev/globalvar" close(fd); } else { printf("device open failure\n"); } } | 编译上述文件:
| gcc -o globalvartest.o globalvartest.c | 运行
可以发现"globalvar"设备可以正确的读写。
|