本文转载自:http://www.cnblogs.com/pengdonglin137/p/3328984.html

hi all and barry,

最近在学习字符设备驱动,不太明白private_data在字符驱动中的作用,我们在

驱动中添加一个设备结构体,然后定义了这个结构体的全局指针变量,接着我们就能在

驱动程序中使用这个指针了。我看到很多驱动程序中都把结构体指针付给private_data,

然后对private_data操作。

为什么要使用private_data,难道仅仅是避免使用全局变量,还有没有其他的作用,

请大侠们指点。

thanks all

liaoye

2011-06-08

cjok

UNIX系统的设计本着一切都是文件的原则。对设备的访问,可以简化成对设备文件的访问。也就是都要经过VFS层, 
file结构体从属于进程的,用来描述某个进程正使用的设备文件, private_data用来直接挂简单的字符设备驱动,刚好是一脉相承。

我 不明白你们讨论的全局变量的想法是什么意思?这和全局变量一点关系也没有。不同的进程访问相同设备,用的是不同的file结构体实例,文件指针也不一 样。。比 方说这个进程想读这一段地址的内容,那个进程想读那一块地址的内容。。。。对同一设备同时访问会有冲突,而这个冲突是由进程调度,中断来解决的

-- 
Best Regards, 
Yu Rong Tan 
_______________________________________________ 
Linux 内核开发中文邮件列表 
Linux-ker...@zh-kernel.org

为了控制设备,需要给设备分配一些自定义的数据结构,如锁或者用链表组成的缓冲区。这些数据结构如果是全局变量,则一个设备驱动 驱动 多个相同设备时, 
多个相同设备就共用了这些自定义数据结构,会引起冲突。

我想您所说的对同一设备同时访问会有冲突,而这个冲突是由进程调度解决的,指的是那些非自定义的数据结构。

在 2011年6月8日 下午1:48,Nancy <nancydream...@gmail.com> 写道:

> UNIX系统的设计本着一切都是文件的原则。对设备的访问,可以简化成对设备文件的访问。也就是都要经过VFS层, 
> file结构体从属于进程的,用来描述某个进程正使用的设备文件, private_data用来直接挂简单的字符设备驱动,刚好是一脉相承。

> 我不明白你们讨论的全局变量的想法是什么意思?这和全局变量一点关系也没有。不同的进程访问相同设备,用的是不同的file结构体实例,文件指针也不一 样。。比 方说这个进程想读这一段地址的内容,那个进程想读那一块地址的内容。。。。对同一设备同时访问会有冲突,而这个冲突是由进程调度,中断来解决的

> -- 
> Best Regards, 
> Yu Rong Tan

> 为了控制设备,需要给设备分配一些自定义的数据结构,如锁或者用链表组成的缓冲区。这些数据结构如果是全局变量,则一个设备驱动 驱动 多个相同设备时, 
> 多个相同设备就共用了这些自定义数据结构,会引起冲突。

你还是没明白。多个相同设备是怎么区分它们的,多个设备名吧,每一个设备名在用到时都对应一个file实例,冲突吗?

> 我想您所说的对同一设备同时访问会有冲突,而这个冲突是由进程调度解决的,指的是那些非自定义的数据结构。

非自定义,自定义的都包括!

-- 
Best Regards, 
Yu Rong Tan

下面是我在网上找到的一段话:

“如果你的驱动中使用了一个全局变量,这就意味着你的驱动只能是专用的,如果同时被多个应用程序打开并且使用,那肯定会相互影响 
。而如果使用这个private_data指针,你可以在驱动的open函数中kmalloc一个你定义的结构体,然后在read,write等函数中通过st ruct 
file结构体获得你的结构体,然后进行相应的操作,这样你的驱动程序就可以支持多个应用程序同时调用。 “

下面这句是Linux设备驱动开发详解上找到的: 
”如果globalmem 不只包括一个设备而是同时包含两个或两个以上的设备,采用private_data的优势就会集中显现出来。“ 
××注:globalmem是本书作者创建的一个虚拟的设备。

private_data的优势我觉得就是第一段话说的意思:支持多个应用程序同时调用。

本人初学者不敢对上面的话做总结,怕误解了原意,请各位大侠,发表一下自己的看法。

thanks all

2011-06-08

cjok

发件人: Yang Xu 
发送时间: 2011-06-08  14:14:08 
收件人: Nancy 
抄送: cjok; 宋宝华; zh-kernel 
主题: Re: file结构体中private_data指针的疑惑

为了控制设备,需要给设备分配一些自定义的数据结构,如锁或者用链表组成的缓冲区。这些数据结构如果是全局变量,则一个设备驱动 驱动 多个相同设备时, 
多个相同设备就共用了这些自定义数据结构,会引起冲突。 
我想您所说的对同一设备同时访问会有冲突,而这个冲突是由进程调度解决的,指的是那些非自定义的数据结构。 
在 2011年6月8日 下午1:48,Nancy <nancydream...@gmail.com> 写道:

> UNIX系统的设计本着一切都是文件的原则。对设备的访问,可以简化成对设备文件的访问。也就是都要经过VFS层, 
> file结构体从属于进程的,用来描述某个进程正使用的设备文件, private_data用来直接挂简单的字符设备驱动,刚好是一脉相承。

> 我不明白你们讨论的全局变量的想法是什么意思?这和全局变量一点关系也没有。不同的进程访问相同设备,用的是不同的file结构体实例,文件指针也不一 样。。比 方说这个进程想读这一段地址的内容,那个进程想读那一块地址的内容。。。。对同一设备同时访问会有冲突,而这个冲突是由进程调度,中断来解决的

> -- 
> Best Regards, 
> Yu Rong Tan

> 下面是我在网上找到的一段话:

> "如果你的驱动中使用了一个全局变量,这就意味着你的驱动只能是专用的,如果同时被多个应用程序打开并且使用,那肯定会相互影响 
> 。而如果使用这个private_data指针,你可以在驱动的open函数中kmalloc一个你定义的结构体,然后在read,write等函数中通过st 
> ruct 
> file结构体获得你的结构体,然后进行相应的操作,这样你的驱动程序就可以支持多个应用程序同时调用。 "

> 下面这句是Linux设备驱动开发详解上找到的: 
> "如果globalmem 不只包括一个设备而是同时包含两个或两个以上的设备,采用private_data的优势就会集中显现出来。" 
> ××注:globalmem是本书作者创建的一个虚拟的设备。

> private_data的优势我觉得就是第一段话说的意思:支持多个应用程序同时调用。

> 本人初学者不敢对上面的话做总结,怕误解了原意,请各位大侠,发表一下自己的看法。

你摘抄的这些话告诉你使用这个private_data指针来挂驱动程序,这样你的驱动程序就可以支持多个应用程序同时调用。而我的那段话是向你解释为什么它能 做到。 
单单一个全局变量是做不到这些事的,会有很多问题,不信你试试就知道了。private_data在这里的功能绝不能和于全局变量划等号。

private_data 的含义是设备的私有数据,体现了一种良好的面向对象的封装思想。将一个对象以及对象的属性(在这里private_data的具体内容 是自定义的)进行封装。譬如同类型的设备有A,B,C,D,简单的通用层的数据结构并不能涵盖设备的全部属性,因此我们有一个private_data可 以让他 们自己每人再挂上自己的对象的属性。简单地说,private_data作为结构体的成员(它本身也很可能是一个结构体),被和设备的其他属性捆绑在一 起,因此 ,在任何场合下,拿到了设备的句柄,也就拿到了它的private_data所指向的属性。

> -- 
> Best Regards, 
> Yu Rong Tan

恩,谢谢您,我可以这样理解吗? 通用的数据结构都包含在了file结构体中(当时private_data也是) 
但是private_data能够由自己定义一些设备属性,就像C++中的子类,即继承了父类的属性,又有自己特 
有的属性。

thanks 
liao ye

发件人: Barry Song 
发送时间: 2011-06-10  09:21:41 
收件人: Nancy 
抄送: cjok; Yang Xu; zh-kernel 
主题: Re: Re: file结构体中private_data指针的疑惑

在 2011年6月8日 下午3:43,Nancy <nancydream...@gmail.com> 写道:

private_data 的含义是设备的私有数据,体现了一种良好的面向对象的封装思想。将一个对象以及对象的属性(在这里private_data的具体内容 是自定义的)进行封装。譬如同类型的设备有A,B,C,D,简单的通用层的数据结构并不能涵盖设备的全部属性,因此我们有一个private_data可 以让他 们自己每人再挂上自己的对象的属性。简单地说,private_data作为结构体的成员(它本身也很可能是一个结构体),被和设备的其他属性捆绑在一 起,因此 ,在任何场合下,拿到了设备的句柄,也就拿到了它的private_data所指向的属性。

> -- 
> Best Regards, 
> Yu Rong Tan

> UNIX系统的设计本着一切都是文件的原则。对设备的访问,可以简化成对设备文件的访问。也就是都要经过VFS层, 
> file结构体从属于进程的,用来描述某个进程正使用的设备文件, private_data用来直接挂简单的字符设备驱动,刚好是一脉相承。

> 我不明白你们讨论的全局变量的想法是什么意思?这和全局变量一点关系也没有。不同的进程访问相同设备,用的是不同的file结构体实例,文件指针也不一 样。。比 方说这个进程想读这一段地址的内容,那个进程想读那一块地址的内容。。。。对同一设备同时访问会有冲突,而这个冲突是由进程调度,中断来解决的

它 表面上和全局变量没有任何关系,但是间接上与全局变量有巨大的关系。如果不能通过struct封装这些属性,则针对具体设备,如何拿到这些属性?正是 priv ate_data已经通过指针将其绑定到了相应的结构体中,才可以透过结构体指针的成员直接拿到它。否则,多个实例势必要使用多个全局变量进行区分。 
我不害伯人,伯人因我而死。

> -- 
> Best Regards, 
> Yu Rong Tan

file结构体中private_data指针的疑惑【转】的更多相关文章

  1. file结构体中private_data指针的疑惑

    转:http://www.360doc.com/content/12/0506/19/1299815_209093142.shtml hi all and barry, 最近在学习字符设备驱动,不太明 ...

  2. C/C++ 错误笔记-在给结构体中的指针赋值时,要注意该指针是否已指向内存空间

    先来看下面的例子: #include <stdlib.h> #include <string.h> #include <stdio.h> #pragma warni ...

  3. c 结构体中存在指针,指针的不同赋值方法

    #include<stdio.h>#include<stdlib.h>#include<string.h>struct parameter{ char *fd; i ...

  4. Pwn with File结构体(三)

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 前面介绍了几种 File 结构体的攻击方式,其中包括修改 vtab ...

  5. C语言文件操作 FILE结构体

    内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...

  6. 刨根问底系列(2)——stdin、stdout、FILE结构体、缓冲区和fflush的理解

    stdin.stdout.FILE结构体.缓冲区和fflush理解 因为之前调试代码时, printf输出的字符串总是被截断了输出(先输出部分, 再输出剩余的), 当时调试了很久, 才知道问题所在, ...

  7. 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明

    [VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...

  8. C语言结构体中的函数指针

      这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...

  9. 【转】C语言中不同的结构体类型的指针间的强制转换详解

    C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...

随机推荐

  1. Leetcode 297.二叉树的序列化和反序列化

    二叉树地序列化和反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. ...

  2. HDU1757-A Simple Math Problem,矩阵快速幂,构造矩阵水过

    A Simple Math Problem 一个矩阵快速幂水题,关键在于如何构造矩阵.做过一些很裸的矩阵快速幂,比如斐波那契的变形,这个题就类似那种构造.比赛的时候手残把矩阵相乘的一个j写成了i,调试 ...

  3. Linux核心参数Shmmax,shmall,shmni

    Linux 下核心参数调整 kernel.shmmax shmmax是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值,shmmax设置应足够大,能在一个共享内存段下容纳下整个的SGA,设置 ...

  4. [vijos1246]文科生的悲哀(二)

    [vijos1246]文科生的悲哀(二) 试题描述 化学不及格的Matrix67无奈选择了文科.他必须硬着头皮艰难地进行着文科的学习. 这学期的政治.历史和地理课本各有n章.每一科的教学必须按章节从前 ...

  5. IE下IFrame引用跨域站点页面时,Session失效问题解决

    问题场景:在一个应用(集团门户)的某个page中, 通过IFrame的方式嵌入另一个应用(集团实时监管系统)的某个页面. 当两个应用的domain 不一样时, 在被嵌入的页面中Session失效.(s ...

  6. poj - 3254 Corn Fields (状态压缩dp入门)

    http://poj.org/problem?id=3254 参考:http://blog.csdn.net/accry/article/details/6607703 农夫想在m*n的土地上种玉米, ...

  7. [Bzoj1767][Ceoi2009]harbingers (树上斜率优化)

    1767: [Ceoi2009]harbingers Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 451  Solved: 120[Submit][S ...

  8. Spring基础入门(二)

    一.AOP 1.AOP概念 aop:面向切面编程,扩展功能不修改源代码实现. AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码. 2.AOP原理 (1)第一种情况,有接口情况,使用动态代理创建 ...

  9. Spring Boot+Profile实现不同环境读取不同配置

    文件结构如下: 但是官方推荐放在config文件夹下. 作用: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中.prod环境下的配 ...

  10. CEF3研究(四)之javascript集成

    一.介绍 谷歌浏览器和CEF使用V8JavaScript Engine作为内容的JavaScript实现.在浏览器中的每个窗口都有它自己在的JS上下文提供作用域和在窗口中安全的执行JS代码.CEF暴露 ...