天下网吧 >> 网吧天地 >> 网吧技术 >> 网吧系统 >> 正文

详解如何为Linux系统编写设备驱动程序

2013-3-5不详佚名

68272">

  int (*ioctl) (struct inode * ,struct file *, unsined int ,unsigned long);

  int (*mmap) (struct inode * ,struct file *, struct vm_area_struct *);

  int (*open) (struct inode * ,struct file *);

  int (*release) (struct inode * ,struct file *);

  int (*fsync) (struct inode * ,struct file *);

  int (*fasync) (struct inode * ,struct file *,int);

  int (*check_media_change) (struct inode * ,struct file *);

  int (*revalidate) (dev_t dev);

  }

  这个结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这是linux的设备驱动程序工作的基本原理。既然是这样,则编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域。

  相当简单,不是吗?

  下面就开始写子程序。

  #include

  #include

  #include

  #include

  #include

  unsigned int test_major = 0;

  static int read_test(struct inode *node,struct file *file,

  char *buf,int count)

  {

  int left;

  if (verify_area(VERIFY_WRITE,buf,count) == -EFAULT )

  return -EFAULT;

  for(left = count ; left > 0 ; left--)

  {

  __put_user(1,buf,1);

  buf++;

  }

  return count;

  }

  这个函数是为read调用准备的。当调用read时,read_test()被调用,它把用户的缓冲区全部写1.buf 是read调用的一个参数。它是用户进程空间的一个地址。但是在read_test被调用时,系统进入核心态。所以不能使用buf这个地址,必须用__put_user(),这是kernel提供的一个函数,用于向用户传送数据。另外还有很多类似功能的函数。请参考。在向用户空间拷贝数据之前,必须验证buf是否可用。


本文来源:不详 作者:佚名

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系email:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下
  • 本周热门
  • 本月热门
  • 阅读排行