Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229974
  • 博文数量: 59
  • 博客积分: 1215
  • 博客等级: 少尉
  • 技术积分: 575
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-09 02:18
文章分类

全部博文(59)

文章存档

2012年(53)

2011年(6)

分类: 嵌入式

2012-01-25 16:38:50

      前面最基本的理论的都讲得差不多了,这一次咱们来先看字符设备的驱动是什么样子的。

      Linux2.6中,用cdev结构体描述一个字符设备。

struct cdev { struct kobject kobj; struct module *owner; struct file_operation *ops; strcut list_head list; dev_t dev; unsigned int count; };

其中dev是设备号,ops就是提供给虚拟文件系统的接口函数。

内核有一组函数操作cdev结构体:

cdev_init(struct cdev *, struct file_operations *)函数用于初始化cdev成员,并建立cdev和file_operations之间的连接。

cdev_alloc()函数用于动态申请一个cdev内存,函数里面用到了一个内核申请动态内存的函数:kzalloc(size,license)。

cdev_add()和cdev_del()函数分别向系统添加和删除一个cdev,完成注册和注销。他们的调用通常发生在模块加载和卸载函数。

在调用cdev_add()函数之前,应该先调用register_chrdev_region()函数或alloc_chrdev_region()函数向系统申请设备号。前者已知设备号,后者未知。

在调用cdev_del()函数之前,同样应该调用unregister_chrdev_region()函数。

file_operation结构体看书吧。

接着讲了模块加载和卸载函数的模板。

接着讲file_operation成员函数。在讲read和write函数的时候,讲到了copy_to_user()和copy_from_user(),具体不说了。

 

下面举了一个globalmem设备驱动的例子。具体看书就可以了。驱动包括加载、卸载和文件操作函数。这里有个技巧,在包括两个或一以上的设备时,把文件的私有数据private_data指向设备结构体(如cdev这些)(P130具体介绍)。还有个技巧是container_of()函数,作用是通过结构体成员的指针找到对应的结构体的指针,在内核编程中十分常用。

阅读(1539) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~