Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12700
  • 博文数量: 4
  • 博客积分: 25
  • 博客等级: 民兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-08 19:32
文章分类
文章存档

2013年(4)

我的朋友

分类: LINUX

2013-01-17 13:14:38

字符设备驱动程序管理的核心对象是字符设备。内核为字符设备抽象出了一个具体的数据结构struct_cdev

定义如下

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;

}

     

阅读(959) | 评论(0) | 转发(0) |
0

上一篇:字符设备(1)

下一篇:没有了

给主人留下些什么吧!~~