分类: 嵌入式
2012-01-25 16:38:50
前面最基本的理论的都讲得差不多了,这一次咱们来先看字符设备的驱动是什么样子的。
Linux2.6中,用cdev结构体描述一个字符设备。
其中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()函数,作用是通过结构体成员的指针找到对应的结构体的指针,在内核编程中十分常用。