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

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

2013-3-5不详佚名

68272">

  这就用到函数verify_area.

  static int write_tibet(struct inode *inode,struct file *file,

  const char *buf,int count)

  {

  return count;

  }

  static int open_tibet(struct inode *inode,struct file *file )

  {

  MOD_INC_USE_COUNT;

  return 0;

  }

  static void release_tibet(struct inode *inode,struct file *file )

  {

  MOD_DEC_USE_COUNT;

  }

  这几个函数都是空操作。实际调用发生时什么也不做,他们仅仅为下面的结构提供函数指针。

  struct file_operations test_fops = {

  NULL,

  read_test,

  write_test,

  NULL, /* test_readdir */

  NULL,

  NULL, /* test_ioctl */

  NULL, /* test_mmap */

  open_test,

  release_test, NULL, /* test_fsync */

  NULL, /* test_fasync */

  /* nothing more, fill with NULLs */

  };

  设备驱动程序的主体可以说是写好了。现在要把驱动程序嵌入内核。驱动程序可以按照两种方式编译。一种是编译进kernel,另一种是编译成模块(modules),如果编译进内核的话,会增加内核的大小,还要改动内核的源文件,而且不能动态的卸载,不利于调试,所以推荐使用模块方式。

  int init_module(void)

  {

  int result;

  result = register_chrdev(0, "test", &test_fops);

  if (result < 0) {

  printk(KERN_INFO "test: cant get major number\n");

  return result;

  }

  if (test_major == 0) test_major = result; /* dynamic */

  return 0;

  }

  在用insmod命令将编译好的模块调入内存时,init_module 函数被调用。在这里,init_module只做了一件事,就是向系统的字符设备表登记了一个字符设备。register_chrdev需要三个参数,参数一是希望获得的设备号,如果是零的话,系统将选择一个没有被占用的设备号返回。参数二是设备文件名,参数三用来登记驱动程序实际执行操作的函数的指针。


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

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