《linux那些事之我是U盘》——很牛
1.device,bus和driver三者的关系(linux设备驱动,除了网络之外,几乎都是这种架构):
首先,usb-storage驱动(usb.c)加载后,先通过usb_register()向usb-core注册u盘驱动,其中参数包含了id_table(主要涉及的是unusual_devs.h)表,这个表中保存了U盘驱动所支持的所有U盘的信息列表;
当U盘插入usb接口后,usb-core会先识别到U盘的基本信息,并与驱动中的id_table匹配,如果配得上,则将这个usb的接口intf和分配给u盘的设备id为参数调用usb-storage驱动的storage_probe()函数,这个函数将进行一系列的准备工作,包括U盘的逻辑单元个数(LUN)查询,各种内存的申请、传输函数的挂勾以及信号量的初始化,并创建模拟scsi的host(u盘的数据访问遵循的是scsi接口,类似于一些硬盘),创建scan和control内核进程,前者负责扫描U盘是否还接着和scsi的host扫描(创建/dev/sd*);后者是与U盘进行数据交互的守护进程。
2.debug.c为调试信息的控制;transport.c涉及与U盘相关的按USB协议编写的代码,如ctrl和bulk数据的传输;protocol.c涉及与scsi相关的代码实现;scsiglue.c中实现的函数供scsi的core回调。
好不容易整到能上网。。。
阅读(1600) | 评论(0) | 转发(0) |