`
javatome
  • 浏览: 854255 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Linux那些事儿之我是U盘(13)从协议中来,到协议中去(下)

 
阅读更多

如果你是急性子,那这时候你一定很想开始看storage_probe函数了,因为整个U盘的工作就是从这里开始的.不过,莎士比亚说过,磨刀不误砍柴功.不妨继续花点时间,至少把四大关键词中最后一个给弄明白了,

前面我们已经了解了device,configuration,interface,还剩最后一个endpoint.USB通信的最基本的形式就是通过endpoint,道上的兄弟管这个叫做端点,一个接口有一个或多个端点,而作为像U盘这样的存储设备吧,它至少有一个控制端点,两个bulk端点.这些端点都是干嘛的?说来话长,真是一言难尽哪.

usb协议里规定了,usb设备有四种通信方式,分别是控制传输,中断传输,批量传输,等时传输.其中,等时传输显然是用于音频和视频一类的设备,这类设备期望能够有个比较稳定的数据流,比如你在网上QQ视频聊天,肯定希望每分钟传输的图像/声音速率是比较稳定的,不能说这一分钟对方看到你在向她向你深情表白,可是下一分钟却看见画面停滞在那里,只能看到你那傻样一动不动,你说这不浪费感情嘛.所以,每一个有良知的男人都应该知道,usb-storage里边肯定不会用到等时传输.因为我们只管copy一个文件,管它第一秒和第二秒的传输有什么区别,只要几十秒内传完了就ok.

相比之下,等时传输是四种传输中最麻烦的,所以,U盘里边用不着,那您就偷着乐去吧.不过我要说,中断传输也用不着,对于U盘来说,的确用不着,虽然说usb mass storage的协议里边有一个叫做CBI的传输协议,CBI就是Control/Bulk/Interrupt,即控制/批量/中断,这三种传输都会用到,但这种传输协议并不适用于U盘,U盘使用的是一个叫做Bulk-Only的传输协议.使用这种协议的设备只有两种传输方式,一种是批量传输,另一种是控制传输,控制传输是任何一种usb设备都必须支持的,它专门用于传输一些控制信息.比如我想查询一下关于这个interface的一些信息,那么就用控制传输,而bulk传输,它就是U盘的主要工作了,读写数据,这种情况就得用bulk传输.具体的传输我们后面再讲.

好了,知道了传输方式,就可以来认识endpoint了.和endpoint齐名的有一个叫做管道,或者有文化的人管这个叫pipe.endpoint就是通信的发送或者接收点,你要发送数据,那你只要把数据发送到正确的端点那里就可以了.之所以U盘有两个bulk端点,是因为端点也是有方向的,一个叫做Bulk in,一个叫做Bulk out,从usb主机到设备称为out,从设备到主机称为in.而管道,实际上只是为了让我们能够找到端点,就相当于我们日常说的邮编地址,比如一个国家,为了通信,我们必须给各个地方取名,完了给各条大大小小的路取名,比如你要揭发你们那里的,你要去上访,你从某偏僻的小县城出发,要到北京来上访,那你的这个端点(endpoint)就是北京,而你得知道你来北京的路线,那这个从你们县城到北京的路线就算一条管道.有人好奇的问了,管道应该有两端吧,一个端点是北京,那另一个端点呢?答案是,这条管道有些特殊,就比如上访,我们只需要知道一端是北京,而另一端是哪里无所谓,因为不管你在哪里你都得到北京来上访.没听说过你在山西你可以上访,你要在宁夏还不能上访了,没这事对吧.

严格来说,管道的另一端应该是usb主机,即前面说的那个host,usb协议里边也是这么说的,协议里边说pipes代表着一种能力,怎样一种能力呢,在主机和设备上的端点之间移动数据,听上去挺玄的.因为事实上,usb里边所有的数据传输都是有主机发起的.一切都是以主机为核心,各种设备紧紧围绕在主机周围.所以呢,usb core里边很多函数就是,为了让usb host能够正确的完成数据传输或者说传输调度,就得告诉host这么一个pipe,换言之,它得知道自己这次调度的数据是传送给谁或者从谁那里传输过来.不过有人又要问了,比如说我要从U盘里读一个文件,那我告诉usb host某个端点能有用吗?那个文件又不是存放在一个端点里边,它不该是存放在U盘里边吗?这个就只能在后面的代码里去知道了.实际上端点这东西是一个很虚的东西,它的身上充分体现了我国军事思想中的声东击西的想法,即数据本身并不是在端点里,但是看上去却觉得仿佛在端点里.这一切的谜团,让我们在storage_probe()函数里去慢慢解开吧.

分享到:
评论

相关推荐

    Linux那些事儿之我是U盘

    根据给定的信息,“Linux那些事儿之我是U盘”这一标题及描述主要聚焦于USB技术在Linux环境下的工作原理和技术细节。接下来,我们将基于这个主题展开深入探讨,涵盖USB技术的基本概念、USB在Linux系统中的实现机制...

    Linux那些事儿之我是USB

    - **从协议中来,到协议中去(上下中下)**:详细阐述了USB协议的基本原理以及在Linux中的具体实现。 - **梦开始的地方**:可能涉及到了作者初次接触USB驱动开发的经历。 - **设备花名册**:列举了Linux系统中支持的...

    linux那些事儿之我是USB.zip

    本压缩包文件"linux那些事儿之我是USB.zip"包含了深入理解Linux USB驱动及内核相关知识的九个文档,包括Block层、EHCI主机控制器、HUB、PCI、SCSI硬盘、Sysfs、UHCI、USB core以及U盘。这些文档旨在提供一个系统性的...

    Linux那些事儿之我是U盘.pdf

    从《Linux那些事儿之我是U盘》这一标题与描述中,我们可以提炼出一系列与Linux操作系统、USB技术以及设备驱动相关的专业知识点。以下是对这些知识点的深入解析: ### 1. Linux与USB技术 #### 关键词理解: - **...

    1.Linux那些事儿之我是U盘1

    【Linux那些事儿之我是U盘1】这篇文章是一个关于Linux内核和USB设备驱动程序的系列教程,作者通过个人经历引入,讲述了自己如何接触并学习Linux技术。文章详细讲解了Linux内核中的USB总线、设备驱动和USB存储设备的...

    Linux那些事儿[完整版]自己整理

    【Linux那些事儿[完整版]】是一份关于Linux操作系统核心知识的综合整理,涵盖了从早期的2.6.10内核版本到2.6.22内核版本的更新与发展。这个资料集旨在深入浅出地讲解Linux系统的核心概念和技术,帮助读者理解Linux...

    Linux那些事儿系列丛书__合集

    ### Linux那些事儿之我是U盘 - **USB技术简介**:作者以幽默的方式回顾了2005年的一次毕业答辩经历,当时被要求用一句话介绍USB技术。这段经历反映出作者对于技术细节的重视以及对USB技术复杂性的理解。 - **关键词...

    Linux那些事儿完全版

    3. **我是U盘.pdf** - 这部分可能讲解了Linux系统下如何识别、挂载和管理USB闪存驱动器,包括USB Mass Storage协议的运用及Linux的MTP(Media Transfer Protocol)支持。 4. **我是HUB.pdf** - HUB(Hub)在USB网络...

    linux内核编程和linux那些事儿

    总的来说,Linux内核编程和Linux那些事儿涵盖了从底层硬件到上层应用的广泛知识,是成为一名熟练的Linux系统管理员或开发者所必须掌握的基础。通过深入学习和实践,你可以更好地理解和利用这个强大的开源操作系统。

    linux那些事全集(pdf)

    "我是SCSI硬盘"部分,讲解了SCSI(Small Computer System Interface)协议和相关驱动在Linux下的实现,这对于理解存储设备的管理和I/O操作至关重要。 "写一个块设备驱动"的章节,提供了编写Linux块设备驱动程序的...

    LINUX那些事儿

    《LINUX那些事儿:我是USB Core》一书深入剖析了Linux操作系统中USB核心(USBCore)的工作原理及其与驱动程序的交互机制。本书通过生动的叙述方式,将复杂的USB技术概念转化为易于理解的故事,引领读者逐步探索USB在...

    usb学习资料

    "Linux那些事儿"可能是指一系列关于Linux系统和USB相关的教程或文档,涵盖了Linux内核的USB支持、驱动开发、设备管理和故障排查等内容。通过这些资料,学习者可以了解到Linux是如何处理USB设备的注册、中断处理、...

    USB设备驱动详解(Linux)

    USB设备驱动详解(Linux) USB(Universal Serial Bus)设备驱动是Linux内核中不可或缺的一部分,它使得...通过阅读《Linux那些事儿之我是U盘.pdf》这样的资料,可以更系统地学习这一领域的知识,提升自己的技能水平。

    USB SPEC V2.0 V3.0

    描述中提到的“Linux那些事儿之我是U盘.pdf”可能是一份关于在Linux操作系统中使用U盘的指南。Linux作为开源操作系统,与Windows和macOS相比,其对USB设备的支持可能会有所不同。用户可能需要了解如何在Linux中识别...

Global site tag (gtag.js) - Google Analytics