07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

1066 if (retval == 0)<br />

1067 printk(KERN_INFO "USB Mass Storage support registered.\n");<br />

1068<br />

1069 return retval;<br />

1070 }<br />

1071<br />

1072 static void __exit usb_stor_exit(void)<br />

1073 {<br />

1074 US_DEBUGP("usb_stor_exit() called\n");<br />

1075<br />

1076 /* Deregister the driver<br />

1077 * This will cause disconnect() to be called for each<br />

1078 * attached unit<br />

1079 */<br />

1080 US_DEBUGP("-- calling usb_deregister()\n");<br />

1081 usb_deregister(&usb_storage_driver) ;<br />

1082 }<br />

1083<br />

10<br />

1084 module_init(usb_stor_init);<br />

1085 module_exit(usb_stor_exit);<br />

其实,module_init/module_exit 只是一个宏,通常写模块的人为了彰显自己的个性,会给自<br />

己的初始化函数和注销函数另外起个名字,比如这里module_init(usb_stor_init)以及<br />

module_exit(usb_stor_exit)实际上就是告诉这个世界,真正的函数是usb_stor_init 和<br />

usb_stor_exit.这种伎俩在Linux 内核代码中屡见不鲜.见多了也就不必大惊小怪了,天要下雨<br />

娘要嫁人,随她去吧.我们下面当然就从usb_stor_init 正式开始我们的探索之旅.<br />

外面的世界很精彩<br />

看代码之前,我曾经认真的思考过这么一个问题,我需要关注的仅仅是drivers/usb/storage/目<br />

录下面那相关的3000 多行代码吗?就是这样几个文件就能让一个个不同的U盘在Linux 下面工<br />

作起来吗? 像一开始那样把这个目录比作一个小城的话,也许,城里的月光很漂亮,她能够把人的<br />

梦照亮,能够温暖人的心房.但我们真的就能厮守在这个城里,一生一世吗?<br />

很不幸,问题远不是这样简单.外面的世界很精彩,作为U 盘,她需要与usb core 打交道,需要与<br />

scsi core 打交道,需要与内存管理单元打交道,还有内核中许许多多其它模块打交道.外面的世<br />

界<br />

很大,远比我们想象的大.<br />

什么是usb core?她负责实现一些核心的功能,为别的设备驱动程序提供服务,比如申请内存,比<br />

如实现一些所有的设备都会需要的公共的函数,事实上,在usb 的世界里,一个普通的设备要正常<br />

的工作,除了要有设备本身以外,还需要有一个叫做控制器的冬冬,老外把它叫做host<br />

controller,<br />

和这个控制器相连接在一起的有另一个咚咚,她叫root hub,hub 我们应该不会陌生,在大学里,<br />

有的宿舍里网口有限,但是我们这一代人上大学基本上是每人一台电脑,所以网口不够,于是有人<br />

会使用hub,让多个人共用一个网口,这是以太网上的hub,而usb 的世界里同样有hub,其实原<br />

理是一样的,任何支持usb 的电脑不会说只允许你只能一个时刻使用一个usb 设备,比如你插入<br />

了u 盘,你同样还可以插入usb 键盘,还可以再插一个usb 鼠标,因为你会发现你的电脑里并不

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!