zoukankan      html  css  js  c++  java
  • file结构体中private_data指针的疑惑【转】

    本文转载自: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

  • 相关阅读:
    POJ 2251 Dungeon Master
    HDU 3085 Nightmare Ⅱ
    CodeForces 1060 B Maximum Sum of Digits
    HDU 1166 敌兵布阵(树状数组)
    HDOJ 2050 折线分割平面
    HDU 5879 Cure
    HDU 1878 欧拉回路
    HDU 6225 Little Boxes
    ZOJ 2971 Give Me the Number
    HDU 2680 Choose the best route
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7103702.html
Copyright © 2011-2022 走看看