《Linux那些事儿之我是USB》我是U盘(5)外面的世界很精彩

来源:岁月联盟 编辑:exp 时间:2011-10-20

看代码之前,我曾经认真地思考过这么一个问题,需要关注的仅仅是drivers/usb/storage/目录下面那相关的3000多行代码吗?就是这样几个文件就能让一个个不同的U盘在Linux下面工作起来吗?像一开始那样把这个目录比成一个小城的话,也许,城里的月光很漂亮,她能够把人的梦照亮,能够温暖人的心房。但我们真的就能厮守在这个城里,一生一世吗?

很不幸,问题远不是这样简单。外面的世界很精彩,作为U盘,她需要与USB Core、SCSI Core、内存管理单元,还有内核中许许多多其他模块打交道。外面的世界很大,远比我们相像的大。

什么是USB Core?它负责实现一些核心的功能,为别的设备驱动程序提供服务,比如申请内存,比如实现一些所有设备都会需要的公共函数。事实上,在USB的世界里,要使一个普通的设备正常地工作,除了要有设备本身以外,还要有主机控制器(Host Controller),和这个控制器相连接在一起的是Root Hub。

Hub应该不会陌生以太网上的Hub允许多个人的计算机共用一个网口。而USB的世界里同样有Hub,其实原理是一样的,任何支持USB的电脑不会说只允许只能一个时刻使用一个USB设备,比如插入了U盘,同样还可以插入USB键盘,还可以再插一个USB鼠标,因为你会发现你的电脑里并不只是一个USB接口。这些口实际上就是所谓的Hub口。而现实中经常是让一个USB控制器和一个Hub绑定在一起,即集成,而这个Hub也被称作Root Hub。换言之,和USB控制器绑定在一起的Hub就是系统中最根本的Hub,其他Hub可以连接到她这里,然后可以延伸出去,外接别的设备,当然也可以不用别的Hub,让USB设备直接接到Root Hub上。

那么USB主机控制器本身是干什么用的呢?控制器,顾名思义,用于控制所有USB设备的通信。通常计算机的CPU并不是直接和USB设备打交道,而是和控制器打交道,它要对设备做什么,他会告诉控制器,而不是直接把指令发给设备,控制器再去负责处理这件事情,会去指挥设备执行命令,而CPU就不用管剩下的事情,还是该干嘛干嘛去,控制器替他去完成剩下的事情,事情办完了再通知CPU。

否则让CPU去盯着每一个设备做每一件事情,那是不现实的,那就好比让一个学院的院长去盯着我们每一个本科生上课,去管理我们的出勤,只能说,不现实。所以我们就被分成了几个系,通常院长有什么指示直接跟各系领导说就可以了,如果他要和三个系主任说事情,他即使不把三个人都召集起来开个会,也可以给三个人各打一个电话,打完电话他就忙他自己的事情去了。

所以,Linux内核开发人员们,专门写了一些代码,并美其名曰USB Core。时代总在发展,当年胖杨贵妃照样迷死唐明皇,而如今人们欣赏的则是林志玲这样的魔鬼身材。同样,早期的Linux内核,其结构并不是如今天这般有层次感,远不像今天这般错落有致,那时候drivers/usb/这个目录下边放了很多很多文件,USB Core与其他各种设备的驱动程序的代码都堆砌在这里,后来,怎奈世间万千的变幻,总爱把有情的人分两端。

于是在drivers/usb/目录下面出来了一个core目录,就专门放一些核心的代码,比如初始化整个USB系统,初始化Root Hub,初始化主机控制器的代码,再后来甚至把主机控制器相关的代码也单独建了一个目录,叫host目录,这是因为USB主机控制器随着时代的发展,也开始有了好几种,不再像刚开始那样只有一种,所以呢,设计者们把一些主机控制器公共的代码仍然留在core目录下,而一些各主机控制器单独的代码则移到host目录下面让负责各种主机控制器的人去维护。常见的主机控制器有三种:EHCI,UHCI和OHCI。

所以这样,出来了三个概念,USB Core,USB主机控制器和USB设备,现实总是很无奈,然而,心若知道灵犀的方向,哪怕不能够朝夕相伴?没错,USB通信的灵魂就是USB协议。USB协议将是所有USB设备和USB主机所必须遵循的游戏规则。这种规则也很自然地体现在了代码中。于是,我们需要了解的不仅仅是drivers/usb/storage/目录下面的文件,还得去了解那外面的世界,虽然,只需要了解一点点。

*****************************

摘自《Linux那些事儿之我是USB》