Linux字符设备驱动中container_of宏的作用

首先看看这个宏的原型:

container_of(ptr,type,member)

功能:根据一个结构体变量中的一个成员变量的指针来获取指向整个结构体变量的指针。

参数:

ptr:已知的结构体成员的首地址(指针);

type:要获取的结构体变量的类型

member:要获取的结构体变量中成员的名字,而不是类型

返回值:要获取的结构体变量的首地址

驱动中常用的用法:

struct hello_device{struct cdev cdev;char  data [128];}hello_device[2];hello_device[0]   //对应 设备0hello_device[1]   //对应 设备1int hello_open(struct inode * inode,struct file * file)
{struct hello_device * dev = container_of(inode->i_cdev,struct hello_device,cdev);file->private_data = dev;}ssize_t hello_read(struct file*,char __user *buff,size_t count,loff_t*){struct hello_device * dev = file->private_data;//dev指向打开的设备结构体copy_to_user(buff,dev->data,count);}

当我们成功insmod一个设备驱动的时候,我们会通过mknod创建一个设备节点和一个具体的设备(驱动)关联,这个节点就对应这个inode结构体的一个实例,这个实例有一个struct cdev类型的字段i_cdev,它会指向hello_device中的cdev结构体(初始化cdev时候完成的)。最终获取到hello_device结构体的首地址,其cdev已经被实例化,对应一个具体的设备。

所以我们可以根据dev->cdev.dev就可以获得当前这个设备的设备号。然后包含具体设备信息的dev结构体就可以通过file中的private_data成员在open,read,write,ioctl之间传递。

Linux字符设备驱动中container_of宏的作用相关推荐

  1. Linux 字符设备驱动结构(一)—— cdev 结构体、设备号相关知识解析

    一.字符设备基础知识 1.设备驱动分类 linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数 ...

  2. Linux 字符设备驱动的编写

    Linux 字符设备驱动的编写 作者:解琛 时间:2020 年 8 月 17 日 Linux 字符设备驱动的编写 一.Linux 设备分类 二.open() 三.数据结构 3.1 struct fil ...

  3. Linux 字符设备驱动结构(四)—— file_operations 结构体知识解析

    前面在 Linux 字符设备驱动开发基础 (三)-- 字符设备驱动结构(中) ,我们已经介绍了两种重要的数据结构 struct inode{...}与 struct file{...} ,下面来介绍另 ...

  4. linux字符设备驱动在哪里设置,从点一个灯开始学写Linux字符设备驱动!

    原标题:从点一个灯开始学写Linux字符设备驱动! [导读] 前一篇文章,介绍了如何将一个hello word模块编译进内核或者编译为动态加载内核模块,本篇来介绍一下如何利用Linux驱动模型来完成一 ...

  5. Linux字符设备驱动

    /*Linux字符设备驱动源代码scdd.c*/ #include <linux/init.h>   /*模块头文件*/ #include <linux/module.h> # ...

  6. 一张图掌握 Linux 字符设备驱动架构!【建议收藏】

    目录 一. Linux 中字符设备驱动简介 二. 字符设备驱动快速入门(超简单demo) 1. demo 2. 代码编译 3. 加载驱动模块 4. 创建设备节点文件 5. APP设备文件操作 6. 卸 ...

  7. ()shi linux字符设备,Linux字符设备驱动基础(三)

    Linux字符设备驱动基础(三) 6 创建设备节点 6.1 手动创建设备节点 查看申请的设备名及主设备号: cat /proc/devices # cat /proc/devices Characte ...

  8. linux设备模型 字符设备,Linux 字符设备驱动模型之框架解说

    一.软件操作硬件设备模型 在进行嵌入式开发的过程中,在常做的事情就是驱动配置硬件设 备,然后根据功能需求使用硬件设备,实现功能的逻辑.如下图为其 相互之间的关系. 如上图所示: 驱动程序:主要作为操作 ...

  9. linux字符设备文件的打开操作,Linux字符设备驱动模型之字符设备初始化

    因为Linux字符设备驱动主要依赖于struct cdev结构,原型为: 所以我们需要对所使用到的结构成员进行配置,驱动开发所使用到的结构成员分别为:[unsigned int count;].[de ...

最新文章

  1. python的or操作符连接多个字符串含义是什么?
  2. Android代码规范
  3. springmvc十六:视图解析
  4. SpringBoot中过滤器和监听器
  5. matlab强制数据类型转换
  6. Android中的拍照camera和camera2
  7. LeetCode【1--两数之和】 LeetCode【2--两数相加】
  8. java面向对象(引用类型--参数传递)
  9. 傅里叶变换滤波之生物信号滤波(笔记03)
  10. kubernetes视频教程笔记 (4)-服务发现-service和pod组建
  11. hive三种建表语句
  12. 安卓 手机硬改 工具下载 一键新机 改串 抹机 root隐藏 改串号MEID imei SN信息 工具教程分享
  13. VHDL——分频器设计
  14. Java面试题大全(2021版)
  15. 伪装成mysql的备_如何伪装成一个服务端开发(六) -- 数据库操作
  16. 数字内容安全实验一:使用Matlab编程实现 RSA 加密算法
  17. 国产API管理工具Eolink太好用了,打造高效的研发利器
  18. maptalks:数据归一化处理与分层设色图层加载
  19. 家用NAS上安装Domino
  20. pythontuple数据类型_阿博的Python之路-详解Tuple数据类型

热门文章

  1. R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)
  2. LDA︱基于LDA的Topic Model变形+一些NLP开源项目
  3. arraylist的remove()循环删除问题
  4. 开源 免费 java CMS - FreeCMS1.3-信息管理
  5. 如何让一个用户拥有root权限
  6. Django笔记13(部署Django)
  7. AngularJS 开发辅助工具
  8. Quill – 可以灵活自定义的开源的富文本编辑器
  9. html底部线条,这种APP底部横线+文字该怎么布局?css
  10. 数组和集合的区别有哪些?