使用cdev结构体描述一个字符设备:
struct cdev {
struct kobject kobj; /* 内嵌的 kobject 对象 */
struct module *owner; /*所属模块*/
struct file_operations *ops; /*文件操作结构体*/
struct list_head list;
dev_t dev; /*设备号*/
unsigned int count;
};
(1)cdev_init()函数用于初始化cdev的成员,并建立cdev和file_operations之间的连接;
(2)cdev_alloc()函数用于动态申请一个cdev内存;
(3)cdev_add()函数和cdev_del()函数分别向系统添加和删除一个cdev,完成字符设备的注册和注销。对cdev_add()的调用通常发生在字符设备驱动模块加载函数中,而对
cdev_del()函数的调用则通常发生在字符设备驱动模块卸载函数中;
(4)在调用cdev_add()函数向系统注册字符设备之前,应首先调用register_chrdev_region()或alloc_chrdev_region()函数向系统申请设备号;
(5)由于内核空间与用户空间的内存不能直接互访,因此借助了函数copy_from_user()完成用户空间到内核空间的拷贝,以及copy_to_user()完成内核空间到用户空间的拷贝【如
果要复制的内存是简单类型,如char、int、long等,则可以使用简单的put_user()和get_user()】;