分类: LINUX
2013-01-17 13:14:38
定义如下
struct cdev{
struct kobject kobj;
struct module *owner;
const struct file_operations *ops;
struct list_head list;
dev_t dev;
unsigned int count;
};
struct kobject kobj
内嵌的内核对象,其用途在“LINUX设备驱动模型”中讨论
struct module *owner
字符设备驱动程序所在的内核模块对象指针
const struct file_operations *ops
struct list_head list
用来将系统中的字符设备形成链表
dev_t dev
字符设备的设备号
unsigned int count
隶属于同一个主设备号的次设备号的个数,用于表示由当前设备驱动程序控制的实际同类设备数量。
设备驱动程序有两种方式来产生struct cdev对象
1静态方式
static struct cdev chr__dev;
2动态方式
static struct cdev *p=kmalloc(sizeof(struct cdev),GFP_KERNEL);
内核代码提供一个函数cdev_alloc专门用于动态分配struct cdev对象
cdev_alloc不仅会为struct cdev对象分配内存空间,还会对该对象进行必要的初始化:
struct cdev* cdev_alloc(void)
{
struct cdev*p=kzalloc(sizeof(struct cdev),GFP_KERNEL);
if(p) {
INIT_LIST_HEAD(&p->list);
kobject_init(&p->kobj,&ktype_cdev_dynamic);
}
return p;
}
需要注意的是,内核引入struct cdev数据结构作为字符设备的抽象,只是满足系统对字符设备驱动程序框架的需要,显示中的硬件设备数据结构往往很复杂,在这种情况下struct cdev作为一个内嵌的数据成员出现在实际设备的数据机构。
struct my_key_pad_dev {
int a;
int b;
int c;
......
struct cdev cdev;
}
以上讨论如何分配一个struct cdev对象,接下来如何初始化一个struct cdev对象
struct cdev初始化函数
void cdev_init(struct cdev*cdev,const struct file_operations *fops)
{
memset(cdev,0,sizeof *cdev);
INIT_LIST_HEAD(&cdev->list);
kobject_init(&cdev->kobj,&ktype_cdev_default);
cdev->ops=fops;
}