编辑: star薰衣草 | 2012-12-12 |
4 月底的某一天,一个偶然的原因,我一时冲动就看了一遍.我们几 个同学在人大附近打麻将,打到夜深了,因为我们几人人住的位置都离得挺远的,各自回去都 得打车,于是决定不如去权金城开个房间,晚上就睡那得了.在权金城洗浴中心,和几个同学洗 浴过后,有人去按摩了,而我和另一个人则留在了房间里,无聊中,那位哥们见我带了电脑,说 他有部 A 片,很不错,不是很大,所以他存在 U 盘里的,他还挺逗的说这是
2008 年北京奥运会 指定 A 片,问我有没有兴趣,这还用问,当然有兴趣了,于是立马打开电脑,插入 u 盘,然后不一 会我就傻了,因为我的电脑根本就不能识别 U 盘,首先我的电脑比较旧,装的是双系统,一个是 Win 98,这个没办法,没有 U 盘驱动,另一个是 Linux,2.6 的内核,按理应该是支持 U 盘的, 问题是实际情况却是我没有看到 U 盘,/dev/目录下面根本没有这么一个盘符,于是我没办法 了,一脸沮丧,而同学在旁边自然表示出了对 Linux 很鄙视的神情. 过了一会,他去看电视了,正好有英超,我却没有心情看电视,想想就觉得奇怪,怎么会不能使 用U盘呢,这不可能啊,一定是我自己对 Linux 下面的一些冬冬没有弄清楚,于是我决定好好 看看问题到底出在哪,记得当时看了一下/var/log/messages 这个日志文件里边好像记录 了一些信息,感觉像是一些错误信息,但是看不明白它到底在说什么.同学开始劝我,算了算了, 改天再看吧,这话我可不愿意听,不是说 Linux 内核源代码是公开的吗,大不了看看源代码,搞 清楚工作原理了还怕问题不能解决?无非就是一些 C 代码而已,好歹哥们也是认真学过谭浩 强大哥那本 C 程序设计的.而且当初那本书课后习题老师基本上都让我们做了,虽说是参考 了那本习题解答的书,可就算写代码不行,读代码还是没问题吧,语法什么的基本上还是很清 楚的,什么判断结构循环结构,包括 goto 语句,还是记得的. 所以我就开始看了,正所谓梦想有多远,就能走多远.以前我只是玩 CS 玩仙剑的时候能够整 晚整晚不睡,但那个晚上,为了告诉我同学,Linux 下也能看 A 片,Linux 下遇到问题更适合自 己解决,我愣是从一点看到快天亮,终于把 drivers/usb/storage/目录下面一万余行的代码 给看了一遍.当然没有看得太仔细,但是很显然把整个原理搞清楚了,问题也很快得以解决. 所以此刻,我整理了一下思路,决定把那晚看的冬冬用文字记录下来.也算为了纪念那个不寻 常的夜晚吧.不过我估计这个篇幅不会短,因为光那一万余行的代码贴出来就得占许许多多 页了,所以这件事情也许会占用我不少时间,然而,还好,每晚有北京不眠夜的陪伴,而且,也许 当我把心思投入到写这个故事的时候,能够把那些压力那些烦恼那种孤独那种郁闷以及那种 对生活的绝望给暂时忘记些许. 小城故事 这个故事中使用的是 2.6.10 的内核代码.Linux 内核代码目录中, 所有去设备驱动程序有关的代 码都在 drivers/目录下面,在这个目录中我们用 ls 命令可以看到很多子目录.
4 localhost:/usr/src/linux-2.6.10/drivers # ls Kconfig atm cdrom eisa ide macintosh message net parpo rt s390 tc w1 Makefile base char fc4 ieee1394 mca misc nubus pci sbus telephony zorro acorn block cpufreq firmware input md mmc oprofile pcmci a scsi usb acpi bluetooth dio i2c isdn media mtd parisc pnp se rial video 其中 usb 目录包含了所有 usb 设备的驱动,而usb 目录下面又有它自己的子目录,进去看一下, localhost:/usr/src/linux-2.6.10/drivers # cd usb/ locahost:/usr/src/linux-2.6.10/drivers/usb # ls Kconfig Makefile README atm class core gadget host image input media misc net serial storage usb-skeleton.c 注意到每一个目录下面都有一个 Kconfig 文件和一个 Makefile,这很重要.稍后会有介绍. 而我们的故事其实是围绕着drivers/usb/storage这个目录来展开的.实际上这里边的代码清清 楚楚地展示了我们日常频繁接触的 U 盘是如何工作的,是如何被驱动起来的.但是这个目录里边 的冬冬并不是生活在世外桃源,他们总是和外面的世界有着千丝万缕的瓜葛.可以继续进来看一 下, localhost:/usr/src/linux-2.6.10/drivers/usb # cd storage/ localhost:/usr/src/linux-2.6.10/drivers/usb/storage # ls Kconfig debug.c freecom.c isd200.c protocol.c sddr09.c shuttle_usbat .c unusual_devs.h Makefile debug.h freecom.h isd200.h protocol.h sddr09.h shuttle_usba t.h usb.c datafab.c dpcm.c initializers.c jumpshot.c scsiglue.c sddr55.c transport.c usb.h datafab.h dpcm.h initializers.h jumpshot.h scsiglue.h sddr55.h transport.h 咋一看,着实吓了一跳,用`wc -l *`这个命令统计一下,12076 行,晕死... 但是,也许,生活中总是充满了跌宕起伏. 认真看了一下 Makefile 和Kconfig 之后,心情明显好了许多. Makefile 不是 Make Love 出来混,迟早要还的. 从前在复旦,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉.毕业的时候,身边的 人读研的读研,出国的出国,找工作的吧,去麦肯锡的去麦肯锡,去IBM 的去 IBM.而自己却一无所 长,没有任何技能,直到这时候才发现那四年欠了很多债,早知今日,何必当初.幸运的是,我还有一