- 论坛徽章:
- 0
|
1084 module_init(usb_stor_init);
1085 module_exit(usb_stor_exit);
其实,module_init/module_exit 只是一个宏,通常写模块的人为了彰显自己的个性,会给自
己的初始化函数和注销函数另外起个名字,比如这里module_init(usb_stor_init) 以及
module_exit(usb_stor_exit) 实际上就是告诉这个世界,真正的函数是usb_stor_init 和
usb_stor_exit. 这种伎俩在Linux 内核代码中屡见不鲜.见多了也就不必大惊小怪了,天要下雨
娘要嫁人,随她去吧.我们下面当然就从usb_stor_init 正式开始我们的探索之旅.
外面的世界很精彩
看代码之前,我曾经认真的思考过这么一个问题,我需要关注的仅仅是drivers/usb/storage/目
录下面那相关的3000 多行代码吗?就是这样几个文件就能让一个个不同的U 盘在Linux 下面工
作起来吗? 像一开始那样把这个目录比作一个小城的话,也许,城里的月光很漂亮,她能够把人的
梦照亮,能够温暖人的心房.但我们真的就能厮守在这个城里,一生一世吗?
很不幸,问题远不是这样简单.外面的世界很精彩,作为U 盘,她需要与usb core 打交道,需要与
scsi core 打交道,需要与内存管理单元打交道,还有内核中许许多多其它模块打交道.外面的世界
很大,远比我们想象的大.
什么是usb core? 她负责实现一些核心的功能,为别的设备驱动程序提供服务,比如申请内存,比
如实现一些所有的设备都会需要的公共的函数,事实上,在usb 的世界里,一个普通的设备要正常
的工作,除了要有设备本身以外,还需要有一个叫做控制器的冬冬,老外把它叫做host controller,
和这个控制器相连接在一起的有另一个咚咚,她叫root hub,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 上.hub 干嘛用的我们知道
了,那么usb host controller 本身是干什么用的呢?controller,控制器,顾名思义,用于控制,控
制什么,控制所有的usb 设备的通信.通常计算机的cpu 并不是直接和usb 设备打交道,而是和控
制器打交道,他要对设备做什么,他会告诉控制器,而不是直接把指令发给设备,然后控制器再去负
责处理这件事情,他会去指挥设备执行命令,而cpu 就不用管剩下的事情,他还是该干嘛干嘛去,
控制器替他去完成剩下的事情,事情办完了再通知cpu. 否则让cpu 去盯着每一个设备做每一件
事情,那是不现实的,那就好比让一个学院的院长去盯着我们每一个本科生上课,去管理我们的出
勤,只能说,不现实.所以我们就被分成了几个系,通常院长有什么指示直接跟各系领导说就可以了,
如果他要和三个系主任说事情,他即使不把三个人都召集起来开个会,也可以给三个人各打一个
电话,打完电话他就忙他自己的事情去了,比如去和他带的女硕士风花雪月.而三个系主任就会去
安排下面的人去执行具体的任务,完了之后他们就会像院长汇报.
所以,Linux 内核开发者们,专门写了一些代码,并美其名曰usb core. 时代总在发展,当年胖杨贵
妃照样迷死唐明皇,而如今人们欣赏的则是林志玲这样的魔鬼身材.同样,早期的Linux 内核,其结
构并不是如今天这般有层次感,远不像今天这般错落有致,那时候drivers/usb/ 这个目录下边放
了很多很多文件,usb core 与其他各种设备的驱动程序的代码都堆砌在这里,后来,怎奈世间万千
的变幻,总爱把有情的人分两端.于是在drivers/usb/ 目录下面出来了一个core 目录,就专门放 |
|