linux那些事儿之U盘
aaronychen
性格适中,爱好运动
展开
-
【转】Linux那些事儿之我是U盘(32)Scsi数据结构-像雾像雨又像风
关于scsi,咱想说的是,在Linux内核中,整个scsi子系统被分为三层.upper level,mid level,lower level,也许您看到这心里很烦,Linux为什么这么麻烦呢.就像某位大侠所说的:真不明白,女孩买很多很多漂亮衣服穿,就是为了吸引男孩的目光,但男孩想看的,却是不穿衣服的女孩.实际上,Linux开发者们把scsi子系统包装成很多层,是为了给您提供方便,但是您看代码的时转载 2008-01-26 10:00:00 · 843 阅读 · 0 评论 -
Linux那些事儿之我是U盘(51)光荣属于苹果,属于诺基亚,属于摩托罗拉,属于索尼爱立信
这一节我们来分析一个在很多企业的产品中都存在的bug.写设备驱动是一件很实在的事情,你得根据实实在在的硬件来编写你的代码,如果你的硬件存在 某种bug,那么你就要去fix它.如果你希望成为通用的驱动程序,那么你就要兼顾各家企业,兼顾各种可能存在的bug.也许一百家企业的产品都可以很好 的被你的程序所支持,但是如果地一百零一家的产品有问题,你就得尽量解决.usb-storage正是这样一个模块.所以转载 2008-01-29 09:41:00 · 973 阅读 · 1 评论 -
Linux那些事儿之我是U盘(50)跟着感觉走(二)
回到usb_stor_invoke_transport()中来,540行,还是老套路,又问是不是命令被放弃了,放弃了当然下面的就别执行了.goto Handle_Abort去.546行,如果有错误,注意正如前面所说,USB_STOR_TRANSPORT_ERROR表示传输本身就是有问题的,比如管道堵塞.而USB_STOR_TRANSPORT_FAILED则只是说明命令传输是没有问题的,就比如你转载 2008-01-29 09:41:00 · 1166 阅读 · 0 评论 -
Linux那些事儿之我是U盘(49)跟着感觉走(一)
接下来的时间里我们会接触两个变量,fake_sense和need_auto_sense,sense顾名思义,感觉.所以就让我们跟着感觉走.我们前面提到过,如果设备想发送比期望值更多的数据,那么我们前面就设了fake_sense为1.这里就来看看设为1之后怎么办.这里咱们看到了这个一个冬冬,usb_stor_sense_invalidCDB,她是谁? 让我们把镜头对准drivers/usb/转载 2008-01-29 09:27:00 · 875 阅读 · 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转载 2008-01-29 09:27:00 · 2796 阅读 · 0 评论 -
Linux那些事儿之我是U盘(47)迷雾重重的Bulk传输(五)
usb_stor_bulk_transfer_sglist()这个函数有一定的蛊惑性,我们前面说过,之所以采用sglist,就是为了提高传输效率.我们更知道,sg的目的就是让一堆不连续的buffers一次DMA操作就都传输出去.其实在usb的故事中,事情并非如此.不过如果你对usb core里边的行为不关心的话,那就无所谓了.有些事情,你不知道也好. 446行,447行,aborting转载 2008-01-29 09:27:00 · 885 阅读 · 0 评论 -
【转】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 279转载 2008-01-29 09:26:00 · 976 阅读 · 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 time转载 2008-01-29 09:26:00 · 1355 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(44)迷雾重重的Bulk传输(二)
其实故事已经讲了很久了,但如果你觉得到这里你已经把故事都看明白了,那么你错了.不仅仅是错了,你这种想法无异于就是,手里拿着一把刀,就以为自己是刀郎,手里举着一个窝头,就以为自己是托塔李天王.不信,我们就继续看,先看535行,us->transport(),这个函数指针同样是在storage_probe的时候被赋值,对于咱们的u盘,她遵守的是Bulk-Only协议,因此us->transport()转载 2008-01-29 09:24:00 · 855 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(43)迷雾重重的Bulk传输(一)
2006年的最后一个星期,来到了北京,开始了北漂的生活.和上海不同的是,在这里待了三个月之后,发现竟然没有下过一次雨,难怪日本小孩说:”你们北京小孩真幸福,城外就是大沙漠,出了城就可以骑骆驼看日落了.”不过,今天下雨了,下了大雨,好大好大,一阵阵的闪电,回家的时候下半身都湿了…(天哪,怎么写着写着又往那个方向走去了…算了,我承认我只是一个用下半身思考的男青年.) 很累,但是听着北京不眠夜,又转载 2008-01-29 09:23:00 · 824 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(42)我型我show--scsi命令集体show
usb_stor_control_thread()基本讲完了,但是其中下面这几行,正是高潮中的高潮.所谓的Bulk传输,所谓的Bulk-Only协议.正是在这里体现出来的.372 /* weve got a command, lets do it! */ 373 else { 374转载 2008-01-29 09:22:00 · 983 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(41)彼岸花的传说(The End)
解决了这个INQUIRY的问题,我们就可以继续往下走了,373行,这就是真正的Bulk传输的地方,proto_handler()就是正儿八经的处理SCSI命令的函数指针.而usb_stor_control_thread之前的所有代码就是为了判断是不是有必要调用proto_handler(),比如超时了,比如模块该卸载了,比如设置了断开flag了,比如要处理的就是这个有问题的INQUIRY,等等这些转载 2008-01-29 09:21:00 · 599 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(40)彼岸花的传说(八)
对于use_sg为0的情况,我们接下来再看206行,offset是函数调用传递进来的参数,注释里说的很清楚,就是用来标志偏移量的,每次copy几个字节她就增加几,最大她也不能超过request_bufflen,这是显然的.usb_stor_access_xfer_buf()这个函数所做的事情就是从srb->request_buffer往buffer里边copy数据,或者反过来从buffer往srb转载 2008-01-29 09:20:00 · 641 阅读 · 0 评论 -
Linux那些事儿之我是U盘(52)有多少爱可以胡来?(一)
上帝给了每个人一支书写人生的铅笔,却未曾给我们橡皮擦.但计算机的世界却并非如此,电脑用着用着觉得不正常了,按一下reset键就一切ok了. (当然你要是中了熊猫烧香啊中了冲击波啥的病毒那就另当别论了,喂,别打岔行不行,我们讲正事呢.)如果人生也可以这样,那么星爷的那段经典的妇孺皆知的”人世间最悲哀的……假如……”的对白恐怕就没有意义了.在驱动程序中,一个非常非常重要的概念就是错误处理.生活不是转载 2008-01-29 09:42:00 · 1370 阅读 · 0 评论 -
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转载 2008-01-29 09:43:00 · 1053 阅读 · 0 评论 -
【转】 Linux那些事儿之我是U盘(29)将控制传输进行到底
其实usb_stor_clear_halt这个函数的作用很简单,就是spec里边规定了,usb设备中,有两类端点,必须具有一个叫做Halt的特征,啥是Halt?查金山词霸去,中断,停止,暂停,怎么解释呢,你把手机关了,就不能给超级女生发短信投票了吧,你把电脑关了,就不能上黄色网站了吧,你把电视机关了,就不能看中国之队在亚洲杯上的精彩表演了吧.对于usb设备来说,其中端端点和Bulk端点就有这么一个转载 2008-01-26 09:58:00 · 1224 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(27)第一次亲密接触(三)
让我们单刀直入,进入usb_stor_msg_common()函数.首先看145行,让us->flags和ABORTING_OR_DISCONNECTING相与,ABORTING_OR_DISCONNECTING宏定义于drivers/usb/storage/usb.h中: 78 /* Dynamic flag definitions: used in set_bit() etc. *转载 2008-01-26 09:56:00 · 787 阅读 · 0 评论 -
【转】 Linux那些事儿之我是U盘(21)冬天来了,春天还会远吗?(五)
道不尽红尘舍恋诉不完人间恩恩怨怨.看完了get_transport()继续看get_protocol()和get_pipes().仍然是来自drivers/usb/storage/usb.c中: 647 /* Get the protocol settings */ 648 static int get_protocol(struct us_data *us) 6转载 2008-01-26 09:51:00 · 624 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(18)冬天来了,春天还会远吗?(二)
我们打开unusual_devs.h吧,随便看一下,发现里边就是很多一个个UNUSUAL_DEV宏,每一行就是这么一个宏,毫无疑问它对应一种设备,我们从其中挑一个来看,比如挑一个三星的吧,过去在Intel的时候,前辈们会说,若不是当初我们对自己太自信了,这个世界上又怎么有三星的生存空间.说的是上世纪末,Intel决定提高flash产品的价格,而Nokia这个大客户不干了,它想找别人,一个叫三星的小转载 2008-01-26 09:23:00 · 811 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(9)总线,设备,和驱动(下)
bus上的两张链表记录了每一个device和driver,那么device和driver这两者之间又是如何联系起来的呢?此刻,必须抛出这样一个问题,先有device还是driver?很久很久以前,在那激情燃烧的岁月里,先有的是device,每一个要用的device在计算机启动之前就已经插好了,插放在它应该在的位置上,然后计算机启动,然后操作系统开始初始化,总线开始扫描设备,每找到一个设备转载 2008-01-26 09:13:00 · 631 阅读 · 0 评论 -
【转】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_转载 2008-01-26 08:57:00 · 666 阅读 · 0 评论 -
【转】 Linux那些事儿之我是U盘(5)外面的世界很精彩
看代码之前,我曾经认真的思考过这么一个问题,我需要关注的仅仅是drivers/usb/storage/目录下面那相关的3000多行代码吗?就是这样几个文件就能让一个个不同的U盘在Linux下面工作起来吗? 像一开始那样把这个目录比作一个小城的话,也许,城里的月光很漂亮,她能够把人的梦照亮,能够温暖人的心房.但我们真的就能厮守在这个城里,一生一世吗?很不幸,问题远不是这样简单.外面的世界很精彩,转载 2008-01-26 08:55:00 · 737 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(4)想到达明天,现在就要启程
既然知道了怎么编写一个模块,那么编写设备驱动程序自然也就不难了.我相信,每一个会写模块的人都不会觉得写设备驱动有困难.对自己行不行不确定的话,可以去问一下葛优,他准说:"(神州行),我看行."真的,我没说假话.写驱动不是什么难事,你完全可以很自信的说,你已经可以写Device Driver了.对,没错,飘柔,就这么自信.前面说了每一个模块都是以module_init开始,以modul转载 2008-01-26 08:54:00 · 1132 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(3)变态的模块机制
有一种感动,叫泪流满面,有一种机制,叫模块机制,十月革命一声炮响,给Linux送来了模块机制.显然,这种模块机制给那些Linux的发烧友们带来了方便,因为模块机制意味着人们可以把庞大的Linux内核划分为许许多多个小的模块,对于编写设备驱动程序的那帮家伙来说,从此以后他们可以编写设备驱动程序却不需要把她编译进内核,不用reboot机器,她只是一个模块,当你需要她的时候,你可以把她抱入怀中(insm转载 2008-01-26 08:53:00 · 681 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(2)Makefile不是Make Love
出来混,迟早要还的.从前在复旦,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉.毕业的时候,身边的人读研的读研,出国的出国,找工作的吧,去麦肯锡的去麦肯锡,去IBM的去IBM.而自己却一无所长,没有任何技能,直到这时候才发现那四年欠了很多债,早知今日,何必当初.幸运的是,我还有一张复旦的文凭,依靠着这张文凭,混进了Intel.然而,工作以后,更是发现当初在校期间没有好好读书其实真转载 2008-01-26 08:52:00 · 867 阅读 · 0 评论 -
Linux那些事儿之我是U盘(大结局)其实世上本有路,走的人多了,也便没了路
其实信号量这东西,就像北京户口,你占了一个名额,我就可能没有了名额.但是有些事情,没有北京户口你又办不成.比如我满怀壮志的走到医院向医生表达说我希望死了以后可以捐献遗体,可得到的只是医生冷冷的回复,对不起,你没有资格,因为你没有户口. 我们前面说过,Linux中,有信号量,有自旋锁,有互斥锁,自旋锁或者互斥锁从某种意义上来说就只是一种特殊的信号量,即信号量意味着资源数量有限,但这个有限也许可转载 2008-01-29 09:43:00 · 815 阅读 · 0 评论 -
Linux那些事儿之我是U盘(54)当梦醒了天晴了
多情自古伤离别,更那堪,冷落清秋节! 今宵酒醒何处? 杨柳岸,晓风残月. 此去经年,应是良辰好景虚设. 便纵有,千种风情,更与何人说? 伴随着婉约派才子,词坛浪子柳永的这首令人肝肠寸断的雨霖铃>>,我们来到了最后一个重要的函数,storage_disconnect. usb设备的热插拔特性注定了我们应该在设备插入的时候做一些事情,在设备拔出的时候做一些事情转载 2008-01-29 09:43:00 · 942 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(39)彼岸花的传说(七)
很显然,我们是把为INQUIRY命令准备的数据保存到了我们自己定义的一个结构体中,即struct data_ptr[36],但是我们是为了回应一个SCSI命令,最终需要知道答案的是scsi核心层.正是它们传递了一个scsi_cmnd结构体下来,即srb.struct scsi_cmnd中有两个成员, unsigned request_bufflen和void *request_buffer,小宇宙转载 2008-01-29 09:19:00 · 649 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(38)彼岸花的传说(六)
七年前,在那个千禧年里,凭借我的父亲母亲>>获得金鸡奖最佳女主角的章子怡姐姐说:"我长得挺漂亮,又是单身,男人不可能对我没兴趣!"是的,古人云,男人分两种,一种是好色,一种是十分好色.所以章子怡这话一点没错.不过,对于大多数80后来说,他们早已不再像十年前那么另类,那么出格,因为他们生活压力很重,他们很老实,很现实,一个显而易见的事实,yy章子怡不如老老实实的学Linux.虽然很多人对两者都有兴趣转载 2008-01-29 09:19:00 · 899 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(13)从协议中来,到协议中去(下)
如果你是急性子,那这时候你一定很想开始看storage_probe函数了,因为整个U盘的工作就是从这里开始的.不过,莎士比亚说过,磨刀不误砍柴功.不妨继续花点时间,至少把四大关键词中最后一个给弄明白了,前面我们已经了解了device,configuration,interface,还剩最后一个endpoint.USB通信的最基本的形式就是通过endpoint,道上的兄弟管这个叫做端点,一个接口转载 2008-01-26 09:18:00 · 752 阅读 · 0 评论 -
【转】 Linux那些事儿之我是U盘(12)从协议中来,到协议中去(中)
星爷说,人有人他妈,妖有妖他妈.说的就是任何事物都有其要遵守的规矩.usb设备要遵循的就是usb协议. 不管是软件还是硬件,在设计的伊始,总是要参考usb协议.怎么设计硬件,如何编写软件,不看usb协议,谁也不可能凭空想象出来.毕竟不是写小说,有几人能像海岩那样,光凭想象就能写出便衣警察,永不瞑目,玉观音这些经典的爱情加案情的作品来呢.usb协议规定了,每个usb设备都得有些基本的元素,转载 2008-01-26 09:17:00 · 645 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(10)我是谁的他?
probe,disconnect,id_table,这三个咚咚中首先要登场亮相的是id_table,它是干嘛用的呢?我们说过,一个device只能绑定一个driver,但driver并非只能支持一种设备,道理很简单,比如我有两块U盘,那么我可以一起都插入,但是我只需要加载一个模块,usb-storage,没听说过插入两块U盘就得加载两次驱动程序的,除非这两块U盘本身就得使用不同的驱动程序.也正转载 2008-01-26 09:15:00 · 668 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(7)狂欢是一群人的孤单
Linux设备模型中三个很重要的概念就是总线,设备,驱动.即bus,device,driver,而实际上内核中也定义了这么一些数据结构,他们是struct bus_type,struct device,struct device_driver,这三个重要的数据结构都来自一个地方,include/linux/device.h.我们知道总线有很多种,pci总线,scsi总线,usb总线,所以我们会看到转载 2008-01-26 08:56:00 · 763 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(6)未曾开始却似结束
还是回到那个初始化函数吧,usb_stor_init,看了它的代码每一个人的心中都有一种莫名的兴奋,因为它太短了,就那么几行,除了两个printk语句以外,就是一个函数的调用,usb_register.printk不用我说,每一个有志青年都该知道,就算没见过printk也该见过printf吧,否则的话,你扪心自问,你对得起谭浩强大哥吗?在谭浩强大哥的带领下我们学会了用#include->mai转载 2008-01-26 08:56:00 · 522 阅读 · 0 评论 -
【转】Linux那些事儿之我是U盘(28)第一次亲密接触(四)
金城武说:不知道从什么时候开始,在什么东西上面都有个日期,秋刀鱼会过期,肉罐头会过期,连保鲜纸都会过期,我开始怀疑,在这个世界上,还有什么东西是不会过期的?有时候我也被这个问题所困扰,我不知道是我不明白还是这世界变化太快.连Linux中都引入了过期这么一个概念.说文雅一点就是超时.设置一个时间,如果时间到了该做的事情还没有做完,那么某些事情就会发生.比如,咱们需要做这样一些事情,定个闹钟,转载 2008-01-26 09:57:00 · 803 阅读 · 0 评论 -
【转】 Linux那些事儿之我是U盘(26)第一次亲密接触(二)
对于设备驱动程序而言,控制传输要做的事情很简单,向usb core提交一个urb,这个urb中间包含了一个命令,或者说控制请求,因为命令更适合于我们后来要讲的某个重要的概念.这里我们要发送的就是GET MAX LUN.我们调用了一个函数, usb_stor_control_msg,其作用从名字上也可以看出,发送控制信息,即控制请求.做一件事情要遵守一件事情的规矩,发送控制信息必须按照一定的格式,发转载 2008-01-26 09:55:00 · 813 阅读 · 0 评论 -
【转】 Linux那些事儿之我是U盘(22)通往春天的管道
1990年,两伊战争,电台里报道早间新闻,播音员说:各位听众朋友,昨天伊拉克截断了科威特的两条输卵管道.(输油管道)此时,树无语天无语人无语.一年后,公元1991年,一个芬兰人写了一个叫做Linux的操作系统,他也觉得这位播音员很有趣,给听众朋友们带来了欢乐.于是为了纪念这件经典的口误,这个芬兰人在Linux中引入了管道这么一个概念,并且他把管道用在很多地方,文件系统中,设备驱动中,于是后转载 2008-01-26 09:52:00 · 741 阅读 · 0 评论 -
【转】 Linux那些事儿之我是U盘(17)冬天来了,春天还会远吗?(一)
整个usb-storage模块的代码中,其最灵魂的部分在一个叫做usb_stor_control_thread()的函数中,而那也自然是我们整个故事的高潮.这个函数的调用有些特殊,我们是从usb_stor_acquire_resources()函数进入的,而后者我们即将遇到,它在整部戏中只出现过一次,即storage_probe中,行号为998的地方.然而在此之前,有四个函数挡在我们面前,它们就是转载 2008-01-26 09:23:00 · 752 阅读 · 0 评论 -
【转】 Linux那些事儿之我是U盘(15)设备花名册
storage_probe这个函数挺有意思的,总长度不足100行,但是干了许多事情,这就像足球场上的后腰,比如切尔西的马克莱莱,在场上并不起眼,但是却为整个团队做出了卓越的贡献.也有很多评论家说银河战舰皇家马德里这几年的衰落正是从赶走这个不起眼的马克莱莱开始的.在讲id_index之前,我们继续贴storage_probe的代码: 943 init_MUTEX(转载 2008-01-26 09:19:00 · 666 阅读 · 0 评论 -
【转】 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_devic转载 2008-01-26 09:16:00 · 602 阅读 · 0 评论