字符设备cdev的分配和初始化
2017-12-29 10:43
225 查看
我们知道注册字符设备首先要有已经分配并初始化好的的cdev,那么就需要内核提供的接口cdev_alloc和cdev_init。下面我们来看看着两个接口是如何实现的:
设备驱动程序中可以使用两种方式来产生struct cdev对象。一种是静态定义的方式,一种是在程序执行期间通过动态分配方式产生:
1.静态定义
static struct cdev chr_dev;
2.动态分配
static struct cdev *chr_dev=kmalloc(sizeof(struct cdev),GFP_KERNEL);
其实,Linux内核中已经提供了一个函数cdev_alloc,是专门用来分配struct cdev对象的。cdev_init不仅会为struct cdev对象分配内存空间,还会对改对象进行必要的初始化:
下面我们看看cdev的初始化接口的实现:
函数代码也是非常直观:首先对结构内存进行清零操作,然后初始化内部的内核链表因子,接下来初始化kobject,最后是文件操作fops赋值到内部的ops中。
一个struct cdev对象在被最终加入系统前,都应该被初始化,无论是直接通过或者是其他途径。理由很简单,这是Linux系统中字符设备驱动框架设计的需要。
设备驱动程序中可以使用两种方式来产生struct cdev对象。一种是静态定义的方式,一种是在程序执行期间通过动态分配方式产生:
1.静态定义
static struct cdev chr_dev;
2.动态分配
static struct cdev *chr_dev=kmalloc(sizeof(struct cdev),GFP_KERNEL);
其实,Linux内核中已经提供了一个函数cdev_alloc,是专门用来分配struct cdev对象的。cdev_init不仅会为struct cdev对象分配内存空间,还会对改对象进行必要的初始化:
<fs/char_dev.c> 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; }
下面我们看看cdev的初始化接口的实现:
<fs/char_dev.c> 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; }
函数代码也是非常直观:首先对结构内存进行清零操作,然后初始化内部的内核链表因子,接下来初始化kobject,最后是文件操作fops赋值到内部的ops中。
一个struct cdev对象在被最终加入系统前,都应该被初始化,无论是直接通过或者是其他途径。理由很简单,这是Linux系统中字符设备驱动框架设计的需要。
相关文章推荐
- 字符设备结构体 cdev 初始化
- 字符设备结构体 cdev 初始化
- 使用cdev_add注册字符设备
- Linux字符驱动中动态分配设备号与动态生成设备节点
- 字符驱动设备中几个重要的结构体(cdev,file_operations,inode,file)
- Linux设备驱动第三天(字符设备驱动、cdev)
- Linux字符驱动中动态分配设备号与动态生成设备节点
- Linux字符设备驱动之cdev_init()
- linux驱动开发--字符设备:静态分配设备号
- 笔记二:字符设备之cdev方式注册字符驱动
- Linux字符驱动中动态分配设备号与动态生成设备节点
- linux驱动学习(四) linux字符设备驱动 cdev
- 字符设备驱动中cdev与inode、file_operations的关系
- linux字符设备驱动 cdev
- Linux字符设备驱动之cdev_init()系列
- 字符设备的初始化之我见:
- Linux字符设备驱动之cdev_init()【十全十美】
- Linux字符设备驱动之cdev_init()系列
- 使用cdev_add注册字符设备的一个例子
- Linux 2.6 字符设备驱动程序分配和释放设备编号