| 
             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): 
		    
                       
		      
		      
		   |