`
dato0123
  • 浏览: 916736 次
文章分类
社区版块
存档分类
最新评论

Linux那些事儿之我是U盘(33)彼岸花的传说(一)

 
阅读更多

彼岸花,花语是悲伤的回忆.

很久很久以前,城市的边缘开满了大片大片的曼珠沙华,它的花香有一种魔力,可以让人想起自己前世的事情.守护曼珠沙华的是两个妖精,一个是花妖叫曼珠,一个是叶妖叫沙华.他们守侯了几千年,可是从来没有见过面,因为开花的时候,就没有叶子,有叶子的时候没有花.他们疯狂地想念着彼此,并被这种痛苦折磨着.终于有一天,他们决定违背神的规定偷偷地见一次面.那一年的曼珠沙华红艳艳的花被惹眼的绿色衬托着,开得格外妖冶美丽.

曼珠和沙华受到惩罚,被打入轮回,并被诅咒永远也不能在一起,生生世世在人世间受到磨难.从那以后,蔓珠沙华又叫彼岸花,意思是开放在天国的花,它的花的形状像一只只在向天堂祈祷的手掌,可是再也没有在这个城市出现过.每年的秋彼岸期间(春分前后三天叫春彼岸,秋分前后三天叫秋彼岸)她会开在黄泉路上,曼珠和沙华的每一次转世在黄泉路上闻到彼岸花的香味就能想起前世的的自己,然后发誓不分开,但只有在这一刻,因为他们会再次跌入诅咒的轮回,灵魂籍由着这花的指引,走向幽冥……

而为了纪念这个美丽而又忧伤的传说,Linux内核中引入了守护进程,也正是与这个传说对应,守护进程也叫内核精灵,当然,如果你觉得人们都太迷信,而你是员,是无神论者,那么ok,你可以叫它为内核线程.事实上我也是无神论者,不过我只敢在白天承认这一点.我们来看具体的代码.

801,调用了kernel_thread()函数,kernel_thread(usb_stor_control_thread, us, CLONE_VM),并将返回值用一个整型变量p来表示,如果从前您对内核本身不是很熟悉,那这个函数就会让您有点头疼了.这个函数将会创建一个内核线程,而函数usb_stor_control_thread()将会执行,us将是传递给她的参数,CLONE_VM只是设定的一个flag,Linux内核不是很熟悉的话,可以将kernel_thread看作类似于fork的冬冬,什么?fork您也不知道?好吧.不知道就不知道,只是依稀记得在那毕业求职的日子里,很多外企的笔试面试中都会问起fork,问一些关于她的返回值的问题,印象中,2004年维尔软件的校园招聘笔试中考过,后来我去Sun中国工程研究院面试也被问起过. 实际上,简单一点说,kernel_thread()这么一执行呢,就会有两个进程,一个是父进程,一个是子进程,子进程将会执行usb_stor_control_thread(),us是作为usb_stor_control_thread函数的参数(实参),CLONE_VM标志表征父子进程之间共享地址空间,执行完usb_stor_control_thread()之后,子进程就结束了,她会调用exit()函数退出.而父进程继续顺着usb_stor_acquire_resources()函数往下走,kernel_thread()函数对于父进程而言返回的是子进程的进程id,所以802行先判断,若是返回值p小于0,则说明出错了,否则,那就把p赋给us的元素pid.

于是,咱们接下来必须再次兵分两路,分别跟踪父进程和子进程前进了.先看父进程,810,执行wait_for_completion(&(us->notify)),如果您说wait_for_completion是谁?您早已经把她忘怀,那么她会很伤心的.记得咱们当初在提交urb的时候调用过她吗?咱们初始化了一个等待队列,urb->done,然后咱们提交了urb,然后咱们通过调用wait_for_completion(&urb->done)进入了等待,进入了睡眠,urbusb core处理完了,或者说被urb host controller处理完了,complete()函数将会被调用,从而唤醒咱们那个进入睡眠的进程.所以此处也一样,us->notify是在很早很早以前storage_probe()函数中初始化的,该函数的945,init_completion(&(us->notify)),struct us_data,有这么一个元素notify,struct completion结构体变量,所以在这里,父进程将进入睡眠,谁来唤醒他?没错,您很聪明,正是子进程,也正是在usb_stor_control_thread()函数中,会有complete(&(us->notify))这么一句,wait_for_completion()complete()是一对青梅竹马的函数,她们总是一起被用,一个设置进程进入睡眠,另一个则负责把这个进入睡眠的进程唤醒,如果您知道信号量的话,她们就类似于信号量中的down()/up()函数对,只不过她们更加安全.

,父进程先搁一搁,反正他进入睡眠了,没人唤醒他的话,他是不会往下走的.来看子进程,也就是usb_stor_control_thread()函数,这个函数定义于drivers/usb/storage/usb.c.咱们下一节再深入这个函数,现在,休息,休息一会...

分享到:
评论

相关推荐

    Linux那些事儿之我是U盘

    Linux那些事儿之我是U盘

    Linux那些事儿之我是U盘.pdf

    Linux那些事儿之我是U盘-有书签版.pdf

    Linux那些事儿

    Linux那些事儿之我是U盘 Linux那些事儿之我是Hub Linux那些事儿之我是USB Core Linux那些事儿之我是UHCI Linux那些事儿之我是EHCI控制器 Linux那些事儿之我是PCI Linux那些事儿之我是SCSI硬盘 Linux那些事儿之我是...

    Linux那些事儿1-9合集

    读过《linux那些事儿之我是U盘》的人,都知道其风格,我就不多说了。 导读: linux那些事儿之我是U盘 linux那些事儿之我是HUB linux那些事儿之我是USB Core linux那些事儿之我是UHCI Linux那些事儿之我是EHCI主机控制...

    Linux那些事儿之全集

    导读.doc Linux那些事儿之我是Block层.pdf Linux那些事儿之我是EHCI主机控制器.pdf Linux那些事儿之我是Hub.pdf Linux那些事儿之我是USB_core.pdf Linux那些事儿之我是U盘.pdf等等 Linux那些事儿系列全在这里了

    Linux那些事儿系列.rar

    》包括《Linux那些事儿之我是Hub》、《Linux那些事儿之我是Sysfs》《Linux那些事儿之我是UHCI》、《Linux那些事儿之我是USB core》、《Linux那些事儿之我是U盘》,令人叹为观止的一个linux系列书籍。只能说,江山代...

    Linux那些事儿(linux内核写的很详细)

    Linux那些事儿 Linux那些事儿之我是Block层 Linux那些事儿之我是Sysfs Linux那些事儿之我是U盘

    Linux那些事儿之我是USB(第2版).pdf

    本次改版修改了第1版中出现的错误,增加了一个附录,主要内容是关于Linux内核的学习方法,是作者的经验总结,值得一读。 本书使用幽默诙谐的笔调对Linux内核中的USB子系统源代码进行了分析,形象且详尽地介绍了USB在...

    Linux那些事儿之我是Hub

    Linux那些事儿之我是Hub,是前面Linux那些事之我是U盘,usb等的姐妹篇

    linux那些事儿之我是U盘

    深入浅出学linux,linux那些事儿系列之我是U盘

    linux的那些事儿全集

    Linux那些事儿之我是Block层 Linux那些事儿之我是EHCI主机控制器 Linux那些事儿之我是Hub Linux那些事儿之我是PCI Linux那些事儿之我是SCSI硬盘 Linux那些事儿之我是Sysfs ...Linux那些事儿之我是U盘

    linux那些事全集

    Linux那些事儿之我是U盘 Linux那些事儿之我是USB_core Linux那些事儿之我是UHCI Linux那些事儿之我是Sysfs Linux那些事儿之我是SCSI硬盘 Linux那些事儿之我是PCI Linux那些事儿之我是Hub Linux那些事儿之我是EHCI...

    Linux那些事儿之我是XXX全集.rar

    Linux那些事儿之我是XXX全集 包含USB core U盘 UHCI PCI SCSI硬盘 Block Hub EHCI 。 想学驱动的童鞋,不妨看看。该书主要是进行源代码的分析

    Linux那些事儿 系列之2 Block+EHCI+PCI+SCSI

    Linux那些事儿之我是Block层.pdf Linux那些事儿之我是EHCI主机控制器.pdf Linux那些事儿之我是PCI.pdf Linux那些事儿之我是SCSI硬盘.pdf 注: 之前有人已经上传了《Linux那些事儿 系列》,其已经包含了:hub,sysfs...

Global site tag (gtag.js) - Google Analytics