bus上的两张链表记录了每一个device和driver,那么device和driver这两者之间又是如何联系起来的呢?此刻,必须抛出这样一个问题,先有device还是driver?
很久很久以前,在那激情燃烧的岁月里,先有的是device,每一个要用的device在计算机启动之前就已经插好了,插放在它应该在的位置上,然后计算机启动,然后操作系统开始初始化,总线开始扫描设备,每找到一个设备,就为其申请一个struct device结构,并且挂入总线中的devices链表中来,然后每一个驱动程序开始初始化,开始注册其struct device_driver结构,然后它去总线的devices链表中去寻找(遍历),去寻找每一个还没有绑定driver的设备,即struct device中的struct device_driver指针仍为空的设备,然后它会去观察这种设备的特征,看是否是他所支持的设备,如果是,那么调用一个叫做device_bind_driver的函数,然后他们就结为了秦晋之好.换句话说,把struct device中的struct device_driver driver指向这个driver,而struct device_driver driver把struct device加入他的那张struct list_head devices链表中来.就这样,bus,device,和driver,这三者之间或者说他们中的两两之间,就给联系上了.知道其中之一,就能找到另外两个.一荣俱荣,一损俱损.
但现在情况变了,在这红莲绽放的日子里,在这樱花伤逝的日子里,出现了一种新的名词,叫热插拔.device可以在计算机启动以后在插入或者拔出计算机了.因此,很难再说是先有device还是先有driver了.因为都有可能.device可以在任何时刻出现,而driver也可以在任何时刻被加载,所以,出现的情况就是,每当一个struct device诞生,它就会去bus的drivers链表中寻找自己的另一半,反之,每当一个一个struct device_driver诞生,它就去bus的devices链表中寻找它的那些设备.如果找到了合适的,那么ok,和之前那种情况一下,调用device_bind_driver绑定好.如果找不到,没有关系,等待吧,等到昙花再开,等到风景看透,心中相信,这世界上总有一个人是你所等的,只是还没有遇到而已.
好,继续,事实上,完善这个三角关系,正是每一个设备驱动初始化阶段所完成的重要使命之一.让我们还是回到代码中来,usb_register这个函数调用是调用了,但是传递给他的参数是什么呢?
我们注意到,那句调用是这样子的,
1064 /* register the driver, return usb_register return code if error */
1065 retval = usb_register(&usb_storage_driver);
是的,传递了一个叫做usb_storage_driver的家伙,这是什么?同一文件中,drivers/usb/storage/usb.c:
232 struct usb_driver usb_storage_driver = {
233 .owner = THIS_MODULE,
234 .name = "usb-storage",
235 .probe = storage_probe,
236 .disconnect = storage_disconnect,
237 .id_table = storage_usb_ids,
238 };
可以看到这里定义了一个struct usb_driver的结构体变量,usb_storage_driver,关于usb_driver我们上节已经说过了,当时主要说的是其中的成员driver,而眼下要讲的则是另外几个成员.首先,.owner和.name这两个没啥好多说的,owner这玩艺是用来给模块计数的,每个模块都这么用,赋值总是THIS_MODULE,而name就是这个模块的名字,usb core会处理它,所以如果这个模块正常被加载了的话,使用lsmod命令能看到一个叫做usb-storage的模块名.重点要讲一讲,.probe和.disconnect以及这个id_table.
分享到:
相关推荐
根据给定的信息,“Linux那些事儿之我是U盘”这一标题及描述主要聚焦于USB技术在Linux环境下的工作原理和技术细节。接下来,我们将基于这个主题展开深入探讨,涵盖USB技术的基本概念、USB在Linux系统中的实现机制...
本压缩包文件"linux那些事儿之我是USB.zip"包含了深入理解Linux USB驱动及内核相关知识的九个文档,包括Block层、EHCI主机控制器、HUB、PCI、SCSI硬盘、Sysfs、UHCI、USB core以及U盘。这些文档旨在提供一个系统性的...
在“LINUX\Linux那些事儿系列”中,我们探索了Linux操作系统的核心概念和技术,这个系列涵盖了多个关于Linux内核和设备驱动程序的关键主题。以下是基于提供的文件名所涉及的几个重要知识点的详细说明: 1. **Linux...
“Linux那些事儿之我是U盘.pdf”将关注通用串行总线(USB)闪存驱动器。这部分会解释Linux如何识别和处理USB闪存设备,包括文件系统的挂载和数据交换过程。 “Linux那些事儿之我是USB Core.pdf”涉及Linux内核的USB...
《Linux那些事儿之我是U盘》不仅是一篇关于USB存储设备在Linux环境下工作的技术文章,还通过作者个人的经历传达了一种积极向上的态度和技术分享的精神。通过对上述知识点的学习,读者不仅可以了解到USB存储设备在...
【Linux那些事儿之我是U盘1】这篇文章是一个关于Linux内核和USB设备驱动程序的系列教程,作者通过个人经历引入,讲述了自己如何接触并学习Linux技术。文章详细讲解了Linux内核中的USB总线、设备驱动和USB存储设备的...
"Linux那些事儿之我是XXX全集"这个资源集合,旨在深入剖析Linux内核中的关键组件,特别是与USB(通用串行总线)相关的部分,包括USB core、U盘、UHCI、PCI、SCSI硬盘、Block层和Hub等核心概念。这些文件将通过源代码...
《Linux那些事儿系列之我是U盘》是一篇深入讲解Linux内核中USB驱动技术的文章,由复旦大学的fudan_abc撰写。该系列文章通过风趣的语言和通俗易懂的方式,阐述了Linux内核从2.6.10到2.6.22.1版本中关于USB驱动模块、...
9. **Linux那些事儿之我是Block层.pdf** Linux Block层是内核的一部分,负责处理块设备I/O请求。这部分将介绍Block层的数据结构,请求队列,多队列调度策略以及如何编写与Block层交互的驱动。 通过学习这些文档,...
通过学习【Linux那些事儿[完整版]】,读者可以深入了解Linux内核的演变,掌握USB设备在Linux系统中的工作原理,以及如何利用Sysfs进行系统监控和管理。这对于Linux开发者、系统管理员以及对操作系统有深厚兴趣的人来...
本系列“Linux那些事儿”将深入探讨Linux设备驱动的相关知识,通过9个PDF文件,涵盖U盘、USB、HUB、EHCI、PCI、UHCI、block、SCSI以及sysfs等多个主题,旨在提供一个全面且通俗易懂的学习资源。 1. **U盘驱动**:...
3. **我是U盘.pdf** - 这部分可能讲解了Linux系统下如何识别、挂载和管理USB闪存驱动器,包括USB Mass Storage协议的运用及Linux的MTP(Media Transfer Protocol)支持。 4. **我是HUB.pdf** - HUB(Hub)在USB网络...