Linux 字符设备驱动结构

本文深入解析Linux内核中的cdev结构体,包括其成员变量的定义和作用,以及如何通过cdev_init、cdev_alloc、cdev_add、cdev_del等函数进行设备管理。同时介绍了如何分配和释放设备号,确保设备注册和注销的正确流程。

1 cdev结构体

struct cdev{
  struct kobject kobj; /* 内嵌的kobject对象*/
  struct module *owner; /* 所属模块 */
  struct file_operations *ops; /* 文件操作结构体 */
  struct list_head list;
  dev_t dev; /* 设备号 */
  unsigned int count;
}

 

cdev 结构体的dev_t成员定义了设备号, 为32位,其中12位主设备号,20位次设备号。使用下列宏可以从dev_t获得主设备号和次设备号:

MAJOR(dev_t dev)

MINOR(dev_t dev)

 

而使用下列宏则可以通过主设备号和次设备号生成dev_t:

MKDEV(int major, int minor)

 

cdev 结构体的另一个重要成员file_operations定义了字符设备驱动提供给虚拟文件系统的接口函数。

 

Linux2.6 内核提供了一组函数用于操作cdev结构体:

void  cdev_init(struct cdev *, struct file_operation *);
struct cdev *cdev_alloc(void);
void cdev_put(struct cdev *p);
int  cdev_add(struct cdev *, dev_t, unsigned);
void cdev_del(struct cdev *);

 

cdev_init()函数用于初始化cdev的成员,并建立cdev和file_operations之间的链接,其源代码清单如下所示:

void cdev_init(struct cdev *cdev, struct file_operations *fops)
{
  memset(cdev, 0, sizeof *cdev);
  INIT_LIST_HEAD(&cdev->list);
  kobject_init(&cdev->kobj, &ktype_cdev_default);
  cdev->ops = fops; /* 将传入的文件操作结构指针赋值给cdev的ops */ }

cdev_alloc()函数用于动态申请一个cdev内存,其源代码如下所示

struct cdev *cdev_alloc(void)
{
    struct cdev *p = kzalloc(sizeof(struct dev), GFP_KERNEL);
    if(p){
        INIT_LIST_HEAD(&p->list);    
        kobject_init(&p->kobj, &ktype_cdev_dynamic);
    }
    return p;
}

cdev_add()函数和cdev_del()函数分别向系统添加和删除一个dev,完成字符设备的注册和注销。

对cdev_add()的调用通常发生在字符设备驱动模块加载函数中,而对cdev_del()函数的调用则通常发生在字符设备驱动模块卸载函数中。

 

2 分配和释放设备号 

    在调用cdev_add()函数向系统注册字符设备之前,应首先调用register_chrdev_region()或alloc_chrdev_region()函数向系统申请设备号,这两个函数原型是 

int register_chrdev_region(dev_t from, unsigned count, const char *name);
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);

 

register_chrdev_region()用于已知启示设备的设备号的情况,而alloc_chrdev_region()用于设备号未知,向系统动态申请未被占用的设备号的情况,函数调用成功以后,会把设备号放入第一个参数dev中。

 

转载于:https://www.cnblogs.com/isisyangyang/p/3986493.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值