您的位置:首页 > 运维架构 > Linux

Linux那些事儿之我是Hub(1)

2012-11-30 22:39 260 查看
最早知道hub是在大学里,复旦的4人间宿舍,条件真好,每个人一张书桌,书桌下面一个网口,但是有时候网口坏了,那可急死人了,要知道当初我们买电脑初衷虽说是为了学习C语言,可是买了之后,C倒是没学,先学了CS.printf还没学会呢,倒是先学会了怎么在CS里喊go go go, fire in the hole!网口坏了就意味着CS不能玩了,当时对人生真的很绝望,后来有人介绍,说6楼几个哥们也有这种情况,然后人家买了hub.所以网口坏了也没事.当时我这个兴奋啊!比过了六级还要high…

事情过了几年,今天我再次回过头来看hub,不过这里看的是usb中的hub.但是很显然,和我们在以太网用的hub不是一回事,但是角色是一样的,都说红花需要绿叶配,在usb的世界里,hub永远都只是绿叶,她不可能是红花,她的存在只是为了支持更多的设备连接到usb总线上来,谁也不会为了使用hub而购买hub,买hub的原因是为了要使用别的设备,而hub就像嫁妆,仅此而已.就像当年我们买hub是为了使用网卡,而不是hub本身.

也许设计代码的人和我一样,希望大家能够更多的给hub一点关注,所以,关于hub的代码在usb core的目录下面.

这个故事中使用的是2.6.22.1的内核代码,这是此刻我能从kernel.org上面获得的最新的内核版本.Linux内核代码目录中, 所有去设备驱动程序有关的代码都在drivers/目录下面,在这个目录中的usb子目录包含了所有usb设备的驱动,而usb目录下面又有它自己的子目录,进去看一下,

localhost:/usr/src/linux-2.6.22.1/drivers # cd usb/

localhost:/usr/src/linux-2.6.22.1/drivers/usb # ls

Kconfig Makefile README atm class core gadget host image misc mon serial storage usb-skeleton.c

注意到每一个目录下面都有一个Kconfig文件和一个Makefile,这很重要.古训有云,再牛B的肖邦也弹不出老子的忧伤,我想说的是,再牛B的黑客如果不看Makefile不看Kconfig,也别想搞清楚这里的结构.很多年轻人喜欢研究usb-skeleton.c,据说这个文件对他们很有启发,所以这里偶也友情推荐一下这个文件.有时间有兴趣的可以看一看,其实就是一个简单的usb设备驱动程序的框架.

关于Makefile,在当年我们讲usb storage的时候已经讲了一些,这里就不重复了,反反复复讲Makefile是不是太没品了点?要是我室友知道了,肯定会问,是不是男人?不过一个很显然的事实摆在这里,在这众多的目录中,我们一眼就能看到有一个叫做core的目录,虽然四六级都是刚刚擦边过,可是core这个词咱们可没少用.当年,和这个词一起走红的另外两个英语单词是simple,na?ve.

好,我们来看core目录.关于usb,有一个很重要的模块,她的名字耐人追寻,usbcore.如果你的电脑是装了Linux,那么你用lsmod命令看一下,有一个模块叫做usbcore.当然,你要是玩嵌入式系统的高手,那么也许你的电脑里没有usb模块,不过我听说如今玩嵌入式的人也喜欢玩usb的,因为usb设备很合嵌入式的口味.看看我的lsmod的输出吧,

localhost:/usr/src/linux-2.6.22.1/drivers/usb/core # lsmod

Module Size Used by

af_packet 55820 2

raw 89504 0

nfs 230840 2

lockd 87536 2 nfs

nfs_acl 20352 1 nfs

sunrpc 172360 4 nfs,lockd,nfs_acl

ipv6 329728 36

button 24224 0

battery 27272 0

ac 22152 0

apparmor 73760 0

aamatch_pcre 30720 1 apparmor

loop 32784 0

usbhid 60832 0

dm_mod 77232 0

ide_cd 57120 0

hw_random 22440 0

ehci_hcd 47624 0

cdrom 52392 1 ide_cd

uhci_hcd 48544 0

shpchp 61984 0

bnx2 157296 0

usbcore 149288 4 usbhid,ehci_hcd,uhci_hcd

e1000 130872 0

pci_hotplug 44800 1 shpchp

reiserfs 239616 2

edd 26760 0

fan 21896 0

thermal 32272 0

processor 50280 1 thermal

qla2xxx 149484 0

firmware_class 27904 1 qla2xxx

scsi_transport_fc 51460 1 qla2xxx

sg 52136 0

megaraid_sas 47928 3

piix 27652 0 [permanent]

sd_mod 34176 4

scsi_mod 163760 5 qla2xxx,scsi_transport_fc,sg,megaraid_sas,sd_mod

ide_disk 32768 0

ide_core 164996 3 ide_cd,piix,ide_disk

找到了usbcore那一行吗?core就是核心,基本上你要在你的电脑里用usb设备,那么两个模块是必须的,一个是usbcore,这就是核心模块,另一个是主机控制器的驱动程序,比如这里usbcore那一行我们看到的ehci_hcd和uhci_hcd,这里偶的是Dell2950的服务器,里边有两个usb host controller.一个是echi的,三个是uhci的.你问我什么是ehci?什么是ohci?就是host controller的接口.从硬件上来说,usb设备要想工作,除了外设本身,必须还有一个咚咚叫做usb
host controller.一般来说,一个电脑里有一个usb host controller就可以了,她就可以控制很多个设备了,比如u盘,比如usb键盘,比如usb鼠标.所有的外设都把自己的请求提交给usb host controller.然后让usb host controller统一来调度.而设备怎么连到host controller上?哎,这就是我们故事的主角,hub,乳名叫做集线器.

关于hub的代码,在drivers/usb/core/目录下面,有一个叫做hub.c的文件.这个文件可不简单.

localhost:/usr/src/linux-2.6.22.1/drivers/usb/core # wc -l hub.c

3122 hub.c

傻眼了,就hub这么一个玩艺儿竟然有三千多行代码,真要是按行计费,写代码的那些家伙还不发财发死?还好不是那样,真要是那样,还不个个都跟赵丽华似的,一个个都成了诗人,开源社区该改成开源诗社了.

三千多行就三千多行吧,总不能见困难就退吧.小的时候我们可都是听着雷锋叔叔的故事长大的,雷锋叔叔的螺丝钉的精神虽然我们学不到,但是雷锋叔叔说的好,对待女同志,要像春天般的温暖!同样,我们对待代码,也要像春天般的温暖.嗯,跟我走吧,现在就出发.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: