字符设备的注册(struct cdev结构体的使用解释)
来源:互联网 发布:dnf画质优化 编辑:程序博客网 时间:2024/06/06 17:39
在linux内核2.6版本以前,注册一个字符设备的的经典方法是使用register_chrdev,相应的从设备中注销字符设备的方法是unregister_chrdev,而在2.6版本以后,字符设备函数的注册与注销使用的是如下一套方法:
#include<linux/cdev.h>
struct cdev *cdev_alloc(void); //分配一个独立的cdev结构
void cdev_init(struct cdev *dev,struct file_operations *fops); //初始化cdev结构
int cdev_add(struct cdev *dev,dev_t num,unsigned int count);
void cdev_del(struct cdev *dev); //移除一个字符设备
内核中每个字符设备都对应一个 cdev结构的变量,下面是它的定义:
struct cdev {
struct kobject kobj; // 每个cdev 都是一个 kobject
struct module *owner; // 指向实现驱动的模块
const struct file_operations *ops; // 操纵这个字符设备文件的方法
struct list_head list; // 与cdev 对应的字符设备文件的 inode->i_devices 的链表头
dev_t dev; // 起始设备编号
unsigned int count; // 设备范围号大小
};
静态内存定义初始化:
cdev_init(&my_cdev, &fops);
my_cdev.owner = THIS_MODULE;
struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &fops;my_cdev->owner = THIS_MODULE;
两种使用方式的功能是一样的,只是使用的内存区不一样,一般视实际的数据结构需求而定。
下面贴出了两个函数的代码,以具体看一下它们之间的差异。
{
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;
}
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{
memset(cdev, 0, sizeof *cdev); 注1;
INIT_LIST_HEAD(&cdev->list);
kobject_init(&cdev->kobj, &ktype_cdev_default);
cdev->ops = fops;
}
初始化 cdev 后,需要把它添加到系统中去。为此可以调用 cdev_add()函数。传入cdev 结构的指针,起始设备编号,以及设备编号范围。
{
p->dev = dev;
p->count = count;
return kobj_map(cdev_map, dev, count, NULL, exact_match, exact_lock, p);
}
当一个字符设备驱动不再需要的时候(比如模块卸载),就可以用 cdev_del()函数来释放cdev 占用的内存。
{
cdev_unmap(p->dev, p->count);
kobject_put(&p->kobj);
}
- 字符设备的注册(struct cdev结构体的使用解释)
- 字符设备的注册(struct cdev结构体的使用解释)
- 字符设备的注册(struct cdev结构体的使用解释)
- cdev 结构体与字符设备的注册
- cdev 结构体与字符设备的注册
- 字符设备驱动--- 数据结构 设备注册struct cdev , 注销
- 字符设备驱动--- 数据结构 设备注册struct cdev , 注销
- 字符驱动设备中几个重要的结构体(cdev,file_operations,inode,file)
- 字符设备结构体 cdev 初始化
- 字符设备结构体 cdev 初始化
- cdev设备驱动的使用
- 设备驱动学习之字符设备驱动内核代码分析(二)——字符设备结构体cdev
- Linux 字符设备驱动结构(一)—— cdev 结构体、设备号相关知识解析
- Linux 字符设备驱动结构(一)—— cdev 结构体、设备号相关知识解析
- Linux 字符设备驱动结构(一)—— cdev 结构体、设备号相关知识解析
- Linux 字符设备驱动结构(一)—— cdev 结构体、设备号相关知识解析
- struct cdev结构体以及相关函数
- 字符设备驱动中cdev与inode、file_operations的关系
- Hibernate的二级缓存
- Unity 创建一个扇形Mesh
- SSE2的算术运算及混合操作对照表
- Hadoop的API操作--上传
- Oracle Data Guard基础原理
- 字符设备的注册(struct cdev结构体的使用解释)
- chrome64滚动链及overscroll-behavior
- ubuntu14.04 install gazebo
- Decision Tree
- HP gen8 服务器快速搭建Centos 7 + lnmp 测试环境
- Linux 下的格式化输出命令:print
- 颠倒一个链表的顺序 C++
- mybatis基础知识(第三更)
- 指向数组的指针【注意】