• 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

  • 相关阅读:
    天天生鲜(一) 表设计
    linux 分区管理
    linux rpm包管理 yum管理
    linux命令
    linux IP 网关配置
    Django的JWT机制工作流程
    django CBV模式源码执行过程
    django 网站上传资源的显示与配置
    图片服务器的架构演进
    php获取指定目录下的所有文件列表
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7103702.html
Copyright © 2020-2023  润新知