字符设备驱动之cdev_init()系列函数

1.内核中每个字符设备都对应一个 cdev 结构的变量,下面是它的定义:

linux-2.6.22/include/linux/cdev.h

struct cdev {

13        struct kobject kobj;

14        struct module *owner;

15        const struct file_operations *ops;

16        struct list_head list;

17        dev_t dev;

18        unsigned int count;

19};

1>kobj是一个嵌入在该结构中的内核对象。它用于该数据结构的一般管理。

2>owner指向提供驱动程序的模块

3>ops是一组文件操作,实现了与硬件通信的具体操作。

4>dev指定了设备号

5>count表示与该设备关联的从设备的数目

6>list用来实现一个链表,其中包含所有表示该设备的设备特殊文件的inode.

2.一个 cdev 一般它有两种定义初始化方式:静态的和动态的

1>静态内存定义初始化:

struct cdev my_cdev;

cdev_init(&my_cdev, &fops);

my_cdev.owner = THIS_MODULE;

2>动态内存定义初始化:

struct cdev *my_cdev = cdev_alloc();

my_cdev->ops = &fops;

my_cdev->owner = THIS_MODULE;

两种使用方式的功能是一样的,只是使用的内存区不一样,一般视实际的数据结构需求而定。

3. 下面是具体实现

1>struct cdve * cdev_alloc(void)

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;

}

2>void cdev_init(struct cdev *cdev, const struct file_operations *fops)函数

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;

}

两个函数完成都功能基本一致,只是 cdev_init() 还多赋了一个 cdev->ops 的值。

cdev_init的参数fops包含了一些函数指针,指向处理与设备实际通信的函数

4.初始化 cdev 后,需要把它添加到系统中去。为此可以调用 cdev_add() 函数。传入 cdev 结构的指针,起始设备编号,以及设备编号范围。

int cdev_add(struct cdev *p, dev_t dev, unsigned count)

{

p->dev = dev;

p->count = count;

return kobj_map(cdev_map, dev, count, NULL, exact_match, exact_lock, p);

}

1>cdev_add的count参数表示该设备提供的从设备号的数量。在cdev_add成功返回后,设备进入活动状态。

2>kobj_map() 内核中所有都字符设备都会记录在一个 kobj_map 结构的 cdev_map 变量中。这个结构的变量中包含一个散列表用来快速存取所有的对象。kobj_map()函数就是用来把字符设备编号和 cdev 结构变量一起保存到 cdev_map 这个散列表里。当后续要打开一个字符设备文件时,通过调用 kobj_lookup() 函数,根据设备编号就可以找到 cdev 结构变量,从而取出其中的 ops 字段。

5.当一个字符设备驱动不再需要的时候(比如模块卸载),就可以用 cdev_del() 函数来释放 cdev 占用的内存

void cdev_del(struct cdev *p)

{

cdev_unmap(p->dev, p->count);

kobject_put(&p->kobj);

}

其中 cdev_unmap() 调用 kobj_unmap() 来释放 cdev_map 散列表中的对象。kobject_put() 释放 cdev 结构本身。

字符设备驱动之cdev_init()系列函数相关推荐

  1. Linux驱动之字符设备驱动

    系列文章目录 第一章 Linux入门之驱动框架 第二章 Linux驱动之字符设备驱动 文章目录 系列文章目录 前言 一.认识字符设备驱动 1.基本概念 2.基本概念 二.字符设备旧框架 1.注册和注销 ...

  2. Linux系统aboutyou,Linux字符设备驱动高级

    设备号:主设备号 + 次设备号   也可以叫主次设备号 新接口注册字符设备驱动,其实就是填充这个struct cdev类型的结构体,主要填充的内容就是 file_operations这个结构体变量,让 ...

  3. linux注册函数机制,Linux可信计算机制模块详细分析之函数实现机制(1)字符设备驱动...

    原标题:Linux可信计算机制模块详细分析之函数实现机制(1)字符设备驱动 2.3 函数实现机制 2.3.1 Linux 字符设备驱动 在linux 3.5.4中,用结构体cdev描述字符设备,cde ...

  4. linux open函数_Linux驱动开发 / 字符设备驱动内幕 (1)

    哈喽,我是老吴,继续记录我的学习心得. 一.保持专注的几个技巧 将最重要的事放在早上做. 待在无干扰环境下,比如图书馆. 意识到刚坐下开始投入工作前,有点负面小情绪是特别正常的现象. 让"开 ...

  5. 系统调用syscall函数和字符设备驱动file_operations

    一.syscall是什么 Linux 中分为用户态和内核态两种运行状态. 对于普通进程,平时都是运行在用户态下,仅拥有基本的运行能力.当进行一些敏感操作,比如说要打开文件(open)然后进行写入(wr ...

  6. linux生成驱动编译的头文件,嵌入式Linux字符设备驱动——5生成字符设备节点

    嵌入式Linux字符设备驱动开发流程--以LED为例 前言 留空 头文件 #include 查看系统设备类 ls /sys/class 设备类结构体 文件(路径):include/linux/devi ...

  7. linux的驱动开发——字符设备驱动

    1.字符设备驱动 \qquad字符设备驱动是最基本,最常用的设备.它将千差万别的硬件设备采用统一的接口封装起来,屏蔽了硬件的差异,简化了应用层的操作. 2.描述所有字符设备的结构体 \qquad描述所 ...

  8. Linux 驱动开发 三:字符设备驱动框架

    一.参考 (3条消息) Linux 字符设备驱动结构(一)-- cdev 结构体.设备号相关知识解析_知秋一叶-CSDN博客 (3条消息) linux设备驱动框架_不忘初心-CSDN博客_linux设 ...

  9. linux 字符设备驱动实战

    文章目录 字符设备 1.加载卸载模块 2.字符设备相关结构体 2.1.file_operations 结构体 2.2.cdev 结构体 2.3.cdev 系列函数 常使用模板如下 3.注册设备号 常使 ...

最新文章

  1. c mysql存储过程实例_MySQL存储过程实例
  2. ideal连接数据库报错The server time zone value ‘�й���׼ʱ��’ is unrecognized or represents more than one time
  3. 9个元素换6次达到排序序列_一文带你读懂排序算法(三):堆排序算法
  4. BUG管理系统(Mantis)迁移实录
  5. Toolbar中Overflow Menu不显示问题
  6. 1-4:CSS3课程入门之文本新增属性
  7. 使用HTML5开发离线应用 - cache manifest
  8. sql数据类型转换oracle,ORACLE SQL数据类型转换
  9. 从外网 SSH 进局域网,反向代理+正向代理解决方案
  10. matlab 里catmull rom,Unity中的曲线插值CatmullRom
  11. Python 实现新冠病毒分布实时追踪
  12. 【word基础知识】在word指定页开始设置页码/页眉
  13. 【Java】关于Java的一些基础知识点
  14. c 连接mysql总是失败_Windows 下用C++连接MYSQL失败
  15. java职称考试试题_SSM框架下的JAVA职称考试模拟系统
  16. LabVIEW状态机小灯按顺序点亮条件结构+自定义枚举
  17. 实战爬虫:python爬虫之爬取虎扑湖人专区新闻中科比相关新闻
  18. oracle 11g rac进程起停
  19. 世界上第一台计算机的问世地点,1946年2月14日 世界上第一台计算机诞生及bug由来...
  20. 美化windows xp 完全教程

热门文章

  1. java magnolia,java – Magnolia富文本字段
  2. python计算夏令时的具体日期,python time.time()和“夏令时”;
  3. 读书:《带人的技术》
  4. 百度编辑器的初步使用
  5. jmeter中CSV Data Set Config的使用
  6. Android Studio自动排版的两种方法
  7. 迷失第一季/全集Lost 1迅雷下载
  8. Qt之QToolButton
  9. linux stat文件,Linux stat命令:显示文件或文件系统的详细信息
  10. iptables总结--理解四表五链/snat/dnat/redirect/synproxy/性能