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.

束for 死循环,从而usb_stor_control_thread 函数到了最后一行,最终调用<br />

complete_and_exit(&(us->notify),0)来结束精灵进程自己并且唤醒我们这里的进入等待的<br />

usb_stor_release_resources.很显然,这里两个进程通过四个函数,或者说两个组合,来实现了进程的同<br />

步,这正是Linux 中内核同步机制的典型应用.(两大组合指的是:up 和down,wait_for_completion 和<br />

complete.)<br />

继续往下,849 行,struct us_data 还有一个元素,extra_data_destructor extra_destructor,这是一<br />

个函数指针,实际上对某些设备来说,她们自己定义了一些额外的函数,在退出之前需要执行,比如Datafab<br />

USB 紧凑读卡器,不过像这样的变态的设备很少,对于大多数设备来说,这个函数指针都为空.如果定义了,<br />

那么就去执行她.<br />

然后856 行,scsi_host_put,只是对这个host 的引用计数减1,如果该host 的引用计数达到0 了,那么<br />

将释放其对应的<strong>Scsi</strong>_Host 数据结构所占的空间.一个scsi 卡在其调用scsi_host_alloc 的时候会被设<br />

置<br />

引用计数为1,引用计数就是表征有多少进程使用了这个资源,我记得外企面试的时候也常常会问到这<br />

个,2005年初,大四下的时候,去张江软件科技园,参加SAP的面试,当时谈到一个无盘工作站的话题,面试官<br />

就问我,既然客户端都没有硬盘,那么如果多个人同时读写服务器上的同一个文件,那岂不是乱套了,当时这<br />

个问题一问我就傻了.后来想想,也许这个和引用计数用点关系吧,再用上那个所谓的写拷贝<br />

(copy-on-write)技术.不过我还是挺喜欢SAP,可惜,人家看不上我.<br />

接下来859 行,判断us->extra,us->extra 就是为前面那个extra_data_destructor 函数准备的参数,<br />

一般不会申请,如果申请过,那就释放她.<br />

再接下来,current_urb 也没用了,释放吧.释放urb 需要调用专门的函数usb_free_urb,她来自<br />

drivers/usb/core/urb.c 中.<br />

到这里咱们前面占有的资源基本上就释放掉了.<br />

再看下一个函数,dissociate_dev(),很显然,这个函数和咱们前面讲的associate_dev()函数是一对.在<br />

associate_dev 函数中,咱们调用了usb_buffer_alloc()函数,先后为us->cr 和us->iobuf 分配了空<br />

间,<br />

所以这里首先调用相对应的函数usb_buffer_free()来释放这两段空间,然后,然后咱们曾经调用<br />

usb_set_intfdata 来令us->pusb_intf 的所对应的设备的driver_data 指向了us,所以这里<br />

usb_set_intfdata()再次调用从而让us->pusb_intf 的driver_data 指向空.最后,调用kfree 释放us.<br />

好了,终于,世界清静了.<br />

最后的最后,我们还有一点点内容要讲,那就是分析一下我们故事中的锁机制,至少我们曾经承诺过,要到<br />

最后才能讲锁机制,理由很简单,只有我们把整个故事都弄明白了,我们才可能弄清楚为什么在某个地方要加<br />

锁,因为锁机制永远都是牵连着多处的代码的,它不是一个人在战斗!<br />

198<br />

其实世上本有路,走的人多了,也便没了路<br />

其实信号量这东西,就像北京户口,你占了一个名额,我就可能没有了名额.但是有些事情,没有北京户口你<br />

又办不成.比如我满怀壮志的走到医院向医生表达说我希望死了以后可以捐献遗体,可得到的只是医生冷冷<br />

的回复,对不起,你没有资格,因为你没有户口.<br />

我们前面说过,Linux 中,有信号量,有自旋锁,有互斥锁,自旋锁或者互斥锁从某种意义上来说就只是一种<br />

特殊的信号量,即信号量意味着资源数量有限,但这个有限也许可能比如像每年的北京户口的名额,有若干<br />

个,<br />

而锁反映的就是更加有限,限制到了数量为一,即类似于所谓的一夫一妻制.她只属于你一个人,一旦你占有<br />

了她,如果别人还要想得到她,除非你释放.或者说除非你抛弃了她.

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

Saved successfully!

Ooh no, something went wrong!