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) { //获得信号量 if (down_interruptible(&sem)) { return - ERESTARTSYS; }
//将global_var从内核空间复制到用户空间 if (copy_to_user(buf, &global_var, sizeof(int))) { up(&sem); return - EFAULT; }
//释放信号量 up(&sem);
return sizeof(int); }
ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off) { //获得信号量 if (down_interruptible(&sem)) { return - ERESTARTSYS; }
//将用户空间的数据复制到内核空间的global_var if (copy_from_user(&global_var, buf, sizeof(int))) { up(&sem); return - EFAULT; }
//释放信号量 up(&sem); return sizeof(int); }
module_init(globalvar_init); module_exit(globalvar_exit);
|
接下来,我们给globalvar的驱动程序增加open()和release()函数,并在其中借助自旋锁来保护对全局变量int globalvar_count(记录打开设备的进程数)的访问来实现设备只能被一个进程打开(必须确保globalvar_count最多只能为1):
|