在linux2.6内核中,使用cdev结构体描述一个字符设备
Linux用户程序通过设备文件(设备节点)来使驱动操作字符设备。
设备文件在啊?字符设备通过字符设备文件来存取。字符设备文件通过主设备号与驱动建立联系。
二、创建设备文件
1、使用mknod命令手工创建
2、自动创建
命令:mknod filename type major minor
mknod serial c 100 1
三、三种重要的数据结构
struct file
struct file_operations
struct inode
struct file结构代表一个打开的文件(系统中每个打开的文件在内核空间中都有一个对应的file结构)它由内核在open时创建,并传递给在该文件进行操作的所有函数,直到最后的close函数。
loff_t f_ops/*文件读写位置*/
struct file_operations *f_op/*与文件相关的操作*/
struct inode 用来记录文件的物理信息。一个文件可以对应多个file结构,但只有一个inode结构。
四、设备注册
字符设备注册分3个步骤:
1、 分配cdev:cdev_alloc()函数实现
2、 初始化cdev:cdev_init()函数
3、 添加cdev: cdev_add()函数
struct cdev{
struct kobject kobj; /*内嵌的kobject对象*/
struct module *owner;
struct file_ operations *ops;
struct list_head list;
dev_t dev;
unsigned int count;
};
void cdev_init(struct cdev *cdev,struct file_operations *fops);
cdev:待初始化的cdev结构。
fops:设备对应的操作。
int cdev_add(struct cdev *dev,dev_t num,unsigned int count);
dev:待添加到内核的字符设备结构
num:设备号
count:添加的设备个数
工程师通常习惯为设备定义一个设备相关的结构体,其包含所涉及的cdev,私有数据及信号量等信息。