
Linux那些事儿 之 我是U盘
文章平均质量分 82
fudan_abc
这个作者很懒,什么都没留下…
展开
-
Linux那些事儿之我是U盘(2)Makefile不是Make Love
出来混,迟早要还的.从前在复旦,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉.毕业的时候,身边的人读研的读研,出国的出国,找工作的吧,去麦肯锡的去麦肯锡,去IBM的去IBM.而自己却一无所长,没有任何技能,直到这时候才发现那四年欠了很多债,早知今日,何必当初.幸运的是,我还有一张复旦的文凭,依靠着这张文凭,混进了Intel.然而,工作以后,更是发现当初在校期间没有好好读书其实真原创 2007-06-19 14:27:00 · 12428 阅读 · 14 评论 -
Linux那些事儿之我是U盘(46)迷雾重重的Bulk传输(四)
在讲数据传输阶段之前,先解决刚才的历史遗留问题. usb_stor_bulk_transfer_buf()中,429行,有一个很有趣的函数interpret_urb_result()被调用.这个函数同样来自drivers/usb/storage/transport.c:277 /* 278 * Interpret the results of a URB transfer原创 2007-07-31 02:21:00 · 4172 阅读 · 0 评论 -
Linux那些事儿之我是U盘(45)迷雾重重的Bulk传输(三)
在usb_stor_Bulk_transport()中, 古人一针见血的为我们指出了这个函数中调用的第一个最重要的函数,那就是usb_stor_bulk_transfer_buf().仍然是来自drivers/usb/stroage/transport.c. 409 /* 410 * Transfer one buffer via bulk pipe, without t原创 2007-07-31 01:36:00 · 7142 阅读 · 4 评论 -
Linux那些事儿之我是U盘(44)迷雾重重的Bulk传输(二)
其实故事已经讲了很久了,但如果你觉得到这里你已经把故事都看明白了,那么你错了.不仅仅是错了,你这种想法无异于就是,手里拿着一把刀,就以为自己是刀郎,手里举着一个窝头,就以为自己是托塔李天王.不信,我们就继续看,先看535行,us->transport(),这个函数指针同样是在storage_probe的时候被赋值,对于咱们的u盘,她遵守的是Bulk-Only协议,因此us->transpor原创 2007-07-31 00:35:00 · 4515 阅读 · 0 评论 -
Linux那些事儿之我是U盘(43)迷雾重重的Bulk传输(一)
2006年的最后一个星期,来到了北京,开始了北漂的生活.和上海不同的是,在这里待了三个月之后,发现竟然没有下过一次雨,难怪日本小孩说:”你们北京小孩真幸福,城外就是大沙漠,出了城就可以骑骆驼看日落了.”不过,今天下雨了,下了大雨,好大好大,一阵阵的闪电,回家的时候下半身都湿了…(天哪,怎么写着写着又往那个方向走去了…算了,我承认我只是一个用下半身思考的男青年.) 很累,但是听着北京不眠夜原创 2007-07-31 00:20:00 · 4835 阅读 · 2 评论 -
Linux那些事儿之我是U盘(38)彼岸花的传说(六)
七年前,在那个千禧年里,凭借我的父亲母亲>>获得金鸡奖最佳女主角的章子怡姐姐说:"我长得挺漂亮,又是单身,男人不可能对我没兴趣!"是的,古人云,男人分两种,一种是好色,一种是十分好色.所以章子怡这话一点没错.不过,对于大多数80后来说,他们早已不再像十年前那么另类,那么出格,因为他们生活压力很重,他们很老实,很现实,一个显而易见的事实,yy章子怡不如老老实实的学Linux.虽然很多人对两者都有兴趣原创 2007-07-28 17:16:00 · 3948 阅读 · 2 评论 -
Linux那些事儿之我是U盘(35)彼岸花的传说(三)
遥想公瑾当年,小乔出嫁了,雄姿英发. 羽扇纶巾,谈笑间,樯橹灰飞烟灭. 故国神游,多情应笑我,早生华发, 人生如梦,一樽还酹江月. 的确,人生如梦,设计Linux代码的人想必非常认可这种观点,因为他们已然把这种思想融入到了代码中去,所以在代码里我们常看到睡眠,唤醒,睡眠,唤醒...而作为当年的大学生,Linus想必也很认同大学生活的现状,即大学生活就是睡觉,只是有的人两个人原创 2007-07-26 23:02:00 · 5344 阅读 · 3 评论 -
Linux那些事儿之我是U盘(42)我型我show--scsi命令集体show
usb_stor_control_thread()基本讲完了,但是其中下面这几行,正是高潮中的高潮.所谓的Bulk传输,所谓的Bulk-Only协议.正是在这里体现出来的.372 /* weve got a command, lets do it! */ 373 else { 374原创 2007-07-28 23:14:00 · 5107 阅读 · 14 评论 -
Linux那些事儿之我是U盘(40)彼岸花的传说(八)
对于use_sg为0的情况,我们接下来再看206行,offset是函数调用传递进来的参数,注释里说的很清楚,就是用来标志偏移量的,每次copy几个字节她就增加几,最大她也不能超过request_bufflen,这是显然的.usb_stor_access_xfer_buf()这个函数所做的事情就是从srb->request_buffer往buffer里边copy数据,或者反过来从buffer原创 2007-07-28 21:22:00 · 3460 阅读 · 0 评论 -
Linux那些事儿之我是U盘(39)彼岸花的传说(七)
很显然,我们是把为INQUIRY命令准备的数据保存到了我们自己定义的一个结构体中,即struct data_ptr[36],但是我们是为了回应一个SCSI命令,最终需要知道答案的是scsi核心层.正是它们传递了一个scsi_cmnd结构体下来,即srb.struct scsi_cmnd中有两个成员, unsigned request_bufflen和void *request_buffer,小宇宙原创 2007-07-28 20:59:00 · 5790 阅读 · 1 评论 -
Linux那些事儿之我是U盘(34)彼岸花的传说(二)
如果让观众短信投票的话,usb_stor_control_thread()这个函数中的代码无疑是整个模块中最为精华的代码.我们只需要它中间301行那个for(;;)就知道,这是一个死循环,即使别的代码都执行完了,即使别的函数都退出了,这个函数仍然像永不消逝的电波一般,经典常驻.显然,只有死循环才能代码永恒.才能代表忠诚.这是每一个守护者的职责.usb_stor_control_thread()原创 2007-07-19 23:14:00 · 4010 阅读 · 1 评论 -
Linux那些事儿之我是U盘(33)彼岸花的传说(一)
彼岸花,花语是悲伤的回忆.很久很久以前,城市的边缘开满了大片大片的曼珠沙华,它的花香有一种魔力,可以让人想起自己前世的事情.守护曼珠沙华的是两个妖精,一个是花妖叫曼珠,一个是叶妖叫沙华.他们守侯了几千年,可是从来没有见过面,因为开花的时候,就没有叶子,有叶子的时候没有花.他们疯狂地想念着彼此,并被这种痛苦折磨着.终于有一天,他们决定违背神的规定偷偷地见一次面.那一年的曼珠沙华红艳艳的花被惹眼的原创 2007-07-19 22:34:00 · 4142 阅读 · 2 评论 -
Linux那些事儿之我是U盘(32)Scsi数据结构-像雾像雨又像风
关于scsi,咱想说的是,在Linux内核中,整个scsi子系统被分为三层.upper level,mid level,lower level,也许您看到这心里很烦,Linux为什么这么麻烦呢.就像某位大侠所说的:真不明白,女孩买很多很多漂亮衣服穿,就是为了吸引男孩的目光,但男孩想看的,却是不穿衣服的女孩.实际上,Linux开发者们把scsi子系统包装成很多层,是为了给您提供方便,但是您看代码原创 2007-07-19 21:54:00 · 6506 阅读 · 4 评论 -
Linux那些事儿之我是U盘(37)彼岸花的传说(五)
燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候;老婆离了,有再找的时候,孩子跑了,有回来的时候;煮熟的鸭子飞了,有飞回来的时候.一个函数没讲完就跳走了,有再回来的时候.其实,那些人,那些事,终究不曾远离.于是,她再一次进入我们的视野. 她就是usb_stor_control_thread().唤醒她的是来自queuecommand的up(&(us->sema)原创 2007-07-27 23:27:00 · 4199 阅读 · 6 评论 -
Linux那些事儿之我是U盘(41)彼岸花的传说(The End)
解决了这个INQUIRY的问题,我们就可以继续往下走了,373行,这就是真正的Bulk传输的地方,proto_handler()就是正儿八经的处理SCSI命令的函数指针.而usb_stor_control_thread之前的所有代码就是为了判断是不是有必要调用proto_handler(),比如超时了,比如模块该卸载了,比如设置了断开flag了,比如要处理的就是这个有问题的INQUIRY,等等原创 2007-07-28 22:44:00 · 3146 阅读 · 1 评论 -
Linux那些事儿之我是U盘(1)小城故事
这个故事中使用的是2.6.10的内核代码.Linux内核代码目录中, 所有去设备驱动程序有关的代码都在drivers/目录下面,在这个目录中我们用ls命令可以看到很多子目录.localhost:/usr/src/linux-2.6.10/drivers # lsKconfig atm cdrom eisa ide macintosh messag原创 2007-06-19 13:30:00 · 12904 阅读 · 10 评论 -
Linux那些事儿之我是U盘--引子
也许是在复旦养成了昼伏夜出的坏习惯,工作之后也总是很晚也不愿意睡.来到北京之后,开始听广播听都市之声的北京不眠夜.这个节目是从23点直到第二天凌晨一点,我常常是听完了才会睡觉.无论是北京还是上海,对我来说,生存总是那么困难,生活的压力总是那么大,每天只有在这个节目中才能够寻找到一丝温暖.我不喜欢躺在床上听,而是喜欢一边听一边做点别的事情,于是心血来潮的决定,写点文字吧,听着电波里别人分享心情,原创 2007-06-19 13:07:00 · 15587 阅读 · 43 评论 -
Linux那些事儿之我是U盘 提供pdf下载
http://www.newsmth.net/att.php?p.299.44271.374.pdf还会继续修改,主要是加入一些图片.比如传输协议的,数据格式的,函数调用关系的图片.预计会在9月初提供更新版本的下载.欢迎指出错误.原创 2007-08-07 17:21:00 · 13636 阅读 · 28 评论 -
Linux那些事儿之我是U盘(大结局)其实世上本有路,走的人多了,也便没了路
其实信号量这东西,就像北京户口,你占了一个名额,我就可能没有了名额.但是有些事情,没有北京户口你又办不成.比如我满怀壮志的走到医院向医生表达说我希望死了以后可以捐献遗体,可得到的只是医生冷冷的回复,对不起,你没有资格,因为你没有户口. 我们前面说过,Linux中,有信号量,有自旋锁,有互斥锁,自旋锁或者互斥锁从某种意义上来说就只是一种特殊的信号量,即信号量意味着资源数量有限,但这个有限也原创 2007-08-04 16:47:00 · 5091 阅读 · 12 评论 -
Linux那些事儿之我是U盘(54)当梦醒了天晴了
多情自古伤离别,更那堪,冷落清秋节! 今宵酒醒何处? 杨柳岸,晓风残月. 此去经年,应是良辰好景虚设. 便纵有,千种风情,更与何人说? 伴随着婉约派才子,词坛浪子柳永的这首令人肝肠寸断的雨霖铃>>,我们来到了最后一个重要的函数,storage_disconnect. usb设备的热插拔特性注定了我们应该在设备插入的时候做一些事情,在设备拔出的时候做一些原创 2007-08-04 15:26:00 · 4585 阅读 · 1 评论 -
Linux那些事儿之我是U盘(53)有多少爱可以胡来?(二)
device_reset()完了之后我们来看bus_reset().同样来自drivers/usb/storage/scsiglue.c中.265 /* This resets the devices USB port. */ 266 /* It refuses to work if theres more than one interface in 267 * the de原创 2007-08-04 13:44:00 · 3601 阅读 · 1 评论 -
Linux那些事儿之我是U盘(52)有多少爱可以胡来?(一)
上帝给了每个人一支书写人生的铅笔,却未曾给我们橡皮擦.但计算机的世界却并非如此,电脑用着用着觉得不正常了,按一下reset键就一切ok了. (当然你要是中了熊猫烧香啊中了冲击波啥的病毒那就另当别论了,喂,别打岔行不行,我们讲正事呢.)如果人生也可以这样,那么星爷的那段经典的妇孺皆知的”人世间最悲哀的……假如……”的对白恐怕就没有意义了.在驱动程序中,一个非常非常重要的概念就是错误处理.生活不是原创 2007-08-03 22:51:00 · 4537 阅读 · 3 评论 -
Linux那些事儿之我是U盘(51)光荣属于苹果,属于诺基亚,属于摩托罗拉,属于索尼爱立信
这一节我们来分析一个在很多企业的产品中都存在的bug.写设备驱动是一件很实在的事情,你得根据实实在在的硬件来编写你的代码,如果你的硬件存在某种bug,那么你就要去fix它.如果你希望成为通用的驱动程序,那么你就要兼顾各家企业,兼顾各种可能存在的bug.也许一百家企业的产品都可以很好的被你的程序所支持,但是如果地一百零一家的产品有问题,你就得尽量解决.usb-storage正是这样一个模块.所以它的原创 2007-08-02 23:09:00 · 5137 阅读 · 0 评论 -
Linux那些事儿之我是U盘(50)跟着感觉走(二)
回到usb_stor_invoke_transport()中来,540行,还是老套路,又问是不是命令被放弃了,放弃了当然下面的就别执行了.goto Handle_Abort去.546行,如果有错误,注意正如前面所说,USB_STOR_TRANSPORT_ERROR表示传输本身就是有问题的,比如管道堵塞.而USB_STOR_TRANSPORT_FAILED则只是说明命令传输是没有问题的,就比如你原创 2007-08-01 23:26:00 · 5074 阅读 · 0 评论 -
Linux那些事儿之我是U盘(49)跟着感觉走(一)
接下来的时间里我们会接触两个变量,fake_sense和need_auto_sense,sense顾名思义,感觉.所以就让我们跟着感觉走.我们前面提到过,如果设备想发送比期望值更多的数据,那么我们前面就设了fake_sense为1.这里就来看看设为1之后怎么办.这里咱们看到了这个一个冬冬,usb_stor_sense_invalidCDB,她是谁? 让我们把镜头对准drivers/usb/原创 2007-08-01 21:17:00 · 7260 阅读 · 0 评论 -
Linux那些事儿之我是U盘(48)迷雾重重的Bulk传输(六)
接下来咱们该看看如何处理CSW了.1018行,usb_stor_bulk_transfer_buf()函数再一次被调用,这次是获得CSW,期望长度是US_BULK_CS_WRAP_LEN,这个宏来自drivers/usb/storage/transport.h中:109 #define US_BULK_CS_WRAP_LEN 1313对应CSW的长度,13个bytes.而cswle原创 2007-07-31 23:24:00 · 4643 阅读 · 1 评论 -
Linux那些事儿之我是U盘(47)迷雾重重的Bulk传输(五)
usb_stor_bulk_transfer_sglist()这个函数有一定的蛊惑性,我们前面说过,之所以采用sglist,就是为了提高传输效率.我们更知道,sg的目的就是让一堆不连续的buffers一次DMA操作就都传输出去.其实在usb的故事中,事情并非如此.不过如果你对usb core里边的行为不关心的话,那就无所谓了.有些事情,你不知道也好. 446行,447行,aborti原创 2007-07-31 21:59:00 · 3940 阅读 · 0 评论 -
Linux那些事儿之我是U盘(31)谁是最变态的结构体?
scsi子系统里的设备使用scsi命令来通信,scsi spec定义了一大堆的命令,spec里称这个为命令集,即所谓的command set.其中一些命令是每一个scsi设备都必须支持的,另一些命令则是可选的.而作为U盘,它所支持的是scsi transparent command set,所以它基本上就是支持所有的scsi命令了,不过我们其实并不关心任何一个具体的命令,只需要了解一些最基本的命令原创 2007-07-18 19:37:00 · 4991 阅读 · 1 评论 -
Linux那些事儿之我是U盘(25)第一次亲密接触(一)
直到现在我们才将第一次真正的开始接触usb的四种数据传输之一,控制传输.应该说从这一刻开始,代码开始变得复杂了.不过不要怕,有我在.在这个美妙的夏夜,让我们剪一段月光,来解代码的霜.769至777行,做了一件事情,确定这个设备的max lun.不要说你不知道什么是max lun.不知道的回去跪主板吧,我很负责任的向你推荐我们Intel最新的3系列整合芯片组主板.在get_transport原创 2007-07-09 23:02:00 · 5648 阅读 · 5 评论 -
Linux那些事儿之我是U盘(15)设备花名册
storage_probe这个函数挺有意思的,总长度不足100行,但是干了许多事情,这就像足球场上的后腰,比如切尔西的马克莱莱,在场上并不起眼,但是却为整个团队做出了卓越的贡献.也有很多评论家说银河战舰皇家马德里这几年的衰落正是从赶走这个不起眼的马克莱莱开始的.在讲id_index之前,我们继续贴storage_probe的代码: 943 init_MUTEX(&原创 2007-06-26 20:28:00 · 7553 阅读 · 7 评论 -
Linux那些事儿之我是U盘(12)从协议中来,到协议中去(中)
星爷说,人有人他妈,妖有妖他妈.说的就是任何事物都有其要遵守的规矩.usb设备要遵循的就是usb协议. 不管是软件还是硬件,在设计的伊始,总是要参考usb协议.怎么设计硬件,如何编写软件,不看usb协议,谁也不可能凭空想象出来.毕竟不是写小说,有几人能像海岩那样,光凭想象就能写出便衣警察,永不瞑目,玉观音这些经典的爱情加案情的作品来呢.usb协议规定了,每个usb设备都得有些基本的元素,称为描原创 2007-06-25 12:55:00 · 6805 阅读 · 4 评论 -
Linux那些事儿之我是U盘(11)从协议中来,到协议中去(上)
在struct usb_driver中,.probe和.disconnect的原型如下:int (*probe) (struct usb_interface *intf,const struct usb_device_id *id);void (*disconnect) (struct usb_interface *intf);我们来看其中的参数,struct usb_devi原创 2007-06-24 17:26:00 · 7046 阅读 · 3 评论 -
Linux那些事儿之我是U盘(8)总线,设备,和驱动(上)
struct bus_type中为devices和drivers准备了两个链表,而代表device的结构体struct device中又有两个成员,struct bus_type *bus和struct device_driver *driver,同样,代表driver的结构体struct device_driver同样有两个成员,struct bus_type *bus和struct list_原创 2007-06-24 13:29:00 · 9593 阅读 · 4 评论 -
Linux那些事儿之我是U盘(4)想到达明天,现在就要启程
既然知道了怎么编写一个模块,那么编写设备驱动程序自然也就不难了.我相信,每一个会写模块的人都不会觉得写设备驱动有困难.对自己行不行不确定的话,可以去问一下葛优,他准说:"(神州行),我看行."真的,我没说假话.写驱动不是什么难事,你完全可以很自信的说,你已经可以写Device Driver了.对,没错,飘柔,就这么自信.前面说了每一个模块都是以module_init开始,以module原创 2007-06-22 21:58:00 · 9220 阅读 · 5 评论 -
Linux那些事儿之我是U盘(5)外面的世界很精彩
看代码之前,我曾经认真的思考过这么一个问题,我需要关注的仅仅是drivers/usb/storage/目录下面那相关的3000多行代码吗?就是这样几个文件就能让一个个不同的U盘在Linux下面工作起来吗? 像一开始那样把这个目录比作一个小城的话,也许,城里的月光很漂亮,她能够把人的梦照亮,能够温暖人的心房.但我们真的就能厮守在这个城里,一生一世吗?很不幸,问题远不是这样简单.外面的世界很精彩,原创 2007-06-22 23:13:00 · 8420 阅读 · 6 评论 -
Linux那些事儿之我是U盘(9)总线,设备,和驱动(下)
bus上的两张链表记录了每一个device和driver,那么device和driver这两者之间又是如何联系起来的呢?此刻,必须抛出这样一个问题,先有device还是driver?很久很久以前,在那激情燃烧的岁月里,先有的是device,每一个要用的device在计算机启动之前就已经插好了,插放在它应该在的位置上,然后计算机启动,然后操作系统开始初始化,总线开始扫描设备,每找到一个设备,原创 2007-06-24 14:15:00 · 7805 阅读 · 2 评论 -
Linux那些事儿之我是U盘(7)狂欢是一群人的孤单
Linux设备模型中三个很重要的概念就是总线,设备,驱动.即bus,device,driver,而实际上内核中也定义了这么一些数据结构,他们是struct bus_type,struct device,struct device_driver,这三个重要的数据结构都来自一个地方,include/linux/device.h.我们知道总线有很多种,pci总线,scsi总线,usb总线,所以我们会看到原创 2007-06-23 01:11:00 · 8437 阅读 · 11 评论 -
Linux那些事儿之我是U盘(6)未曾开始却似结束
还是回到那个初始化函数吧,usb_stor_init,看了它的代码每一个人的心中都有一种莫名的兴奋,因为它太短了,就那么几行,除了两个printk语句以外,就是一个函数的调用,usb_register.printk不用我说,每一个有志青年都该知道,就算没见过printk也该见过printf吧,否则的话,你扪心自问,你对得起谭浩强大哥吗?在谭浩强大哥的带领下我们学会了用#include->mai原创 2007-06-22 23:36:00 · 7818 阅读 · 3 评论 -
Linux那些事儿之我是U盘(3)变态的模块机制
有一种感动,叫泪流满面,有一种机制,叫模块机制,十月革命一声炮响,给Linux送来了模块机制.显然,这种模块机制给那些Linux的发烧友们带来了方便,因为模块机制意味着人们可以把庞大的Linux内核划分为许许多多个小的模块,对于编写设备驱动程序的那帮家伙来说,从此以后他们可以编写设备驱动程序却不需要把她编译进内核,不用reboot机器,她只是一个模块,当你需要她的时候,你可以把她抱入怀中(in原创 2007-06-20 19:18:00 · 10418 阅读 · 13 评论 -
Linux那些事儿之我是U盘(14)梦开始的地方
对于整个usb-storage模块,usb_stor_init()是它的开始,然而,对于U盘驱动程序来说,它真正驱使U盘工作却是始于storage_probe().两条平行线只要相交,就注定开始纠缠一生,不管中间是否短暂分离. usbcore为设备找到了适合她的驱动程序,或者为驱动程序找到了他所支持的设备,但这只是表明双方的第一印象还可以,但彼此是否真的适合对方还需要进一步的了解.毋庸置疑,了原创 2007-06-25 15:58:00 · 7252 阅读 · 4 评论