最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【转】网卡驱动注册到PCI总线这一过程的分析

Driver crifan 3538浏览 0评论

【转】网卡驱动注册到PCI总线这一过程的分析

原始帖子:

网卡驱动注册到PCI总线这一过程的分析

http://linux.chinaunix.net/bbs/viewthread.php?tid=1052717

整理后的pdf版本的:

网卡驱动注册到PCI总线这一过程的分析.pdf (475.15 KB)

此处只摘录关于Linux驱动中bus,和device和driver的关系的部分内容:

1. 总线、设备和驱动
1.1 简单介绍
        Linux设备模型中三个很重要的概念就是总线、设备和驱动,即bus,device和driver。它们分别对应的数据结构分别为struct bus_type,struct device和struct device_driver。
        总线是处理器与一个或多个设备之间的通道,在设备模型中,所有的设备都通过总线相连。在最底层,Linux系统中的每一个设备都用device结构的一个实例来表示。而驱动则是使总线上的设备能够完成它应该完成的功能。
        在系统中有多种总线,如PCI总线、SCSI总线等。系统中的多个设备和驱动是通过总线让它们联系起来的。在bus_type中两个很重要的成员就是struct kset drivers和struct kset devices。它分别代表了连接在这个总线上的两个链,一个是设备链表,另一个则是设备驱动链表。也就是说,通过一个总线描述符,就可以找到挂载到这条总线上的设备,以及支持该总线的不同的设备驱动程序。
1.2 总线、设备与驱动的绑定
        在系统启动时,它会对每种类型的总线创建一个描述符,并将使用该总线的设备链接到该总线描述符的devices链上来。也即是说在系统初始化时,它会扫描连接了哪些设备,并且为每个设备建立一个struce device变量,然后将该变量链接到这个设备所连接的总线的描述符上去。另一方面,每当加载了一个设备驱动,则系统也会准备一个struct device_driver结构的变量,然后再将这个变量也链接到它所在总线的描述符的drivers链上去。       
        对于设备来说,在结构体struct device中有两个重要的成员,一个是struct bus_type *bus,另一个是struct device_driver *driver。bus成员就表示该设备是链接到哪一个总线上的,而driver成员就表示当前设备是由哪个驱动程序所驱动的。对于驱动程序来说,在结构体struct device_driver中也有两个成员,struct bus_type *bus和struct list_head devices,这里的bus成员也是指向这个驱动是链接到哪个总线上的,而devices这个链表则是表示当前这个驱动程序可以去进行驱动的那些设备。一个驱动程序可以支持一个或多个设备,而一个设备则只会绑定给一个驱动程序。
        对于device与device_driver之间建立联系的方式,主要有两种方式。第一种,在计算机启动的时候,总线开始扫描连接在其上的设备,为每个设备建立一个struct device变量并链接到该总线的devices链上,然后开始初始化不同的驱动程序,驱动程序到它所在的总线的devices链上去遍历每一个还没有被绑定给某个驱动的设备,然后再查看是否能够支持这种设备,如果它能够支持这种设备,则将这个设备与这个驱动联系起来。即,将这个设备的device变量加到驱动的devices链上,同时让struct device中的device_driver指向当前这个驱动。第二种则是热插拔。也即是在系统运行时插入了设备,此时内核会去查找在该bus链上注册了的device_driver,然后再将设备与驱动联系起来。设备与驱动根据什么规则联系起来,它们是如何被联系起来的代码我们将在后面的章节进行详细的描述。

转载请注明:在路上 » 【转】网卡驱动注册到PCI总线这一过程的分析

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (5)

  1. 想问一下关于热挺拔的问题。假定在一个嵌入式系统里,比方说LEON3系统里,它支持AMBA Plug&Play,但如果要写一个类似PC上显卡的驱动的话,它不可能是在系统运行时插入,那么有没有必要把它注册到AMBA Plug&Play子系统里,还是完全没有必要,那样反而会很麻烦?
    Michael11年前 (2013-11-18)回复
    • 1.对于LEON3不熟悉。去搜了搜,才大概知道做什么的。 2.你的LEON3,是自己去设计硬件的SoC,还是为已经设计好的SoC去写软件驱动? 3.没看懂你想要问什么
      crifan11年前 (2013-11-19)回复
      • 谢谢你的回复。是为已经设计好的SoC写软件驱动,我看过ARM的显示驱动,也就是LCD的framebuffer驱动,它是做为一个平台(platform)设备注册到内核驱动模型中去的,一般LCD的接口是VGA或QVGA,我是想知道如果给LEON3写一个显示驱动(Framebuffer驱动),是不是也可以像ARM一样按照平台设备注册到内核里,而不用注册到AMBA P&P子系统中,这样对performance应该也没有影响吧?而且如果LEON3用的显示接口是HDMI的话,是不是FrameBuffer的驱动也会不一样?
        Michael11年前 (2013-11-21)回复
        • 在看了一堆资料: http://linux-sunxi.org/Display http://linux-sunxi.org/Display http://www.spinics.net/lists/linux-fbdev/msg01156.html http://en.wikipedia.org/wiki/Linux_framebuffer http://blog.csdn.net/wowo1109/article/details/8805045 http://forum.odroid.com/viewtopic.php?f=19&t=1503 https://github.com/genodelabs/genode/issues/796 后,我的感觉是: 1.应该注册到平台设备中,而不是P&P中 2.对于性能,应该是正常的,不影响的。 3.如果显示接口用HDMI,驱动应该也还是FrameBuffer,但是当然内部代码会不一样,会涉及到针对HDMI方面的内容去初始化等等。
          crifan11年前 (2013-11-21)回复
          • 非常感谢你的解答。
            Michael11年前 (2013-11-21)回复
93 queries in 0.145 seconds, using 22.22MB memory