You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
在最新版本的Linux 内核中这段代码被修改了(用今天流行的话说就是被和谐掉了).有兴趣的同志们可以<br />
关注一下2.6.22 版的内核.<br />
最后的最后,补充一点,为什么scsi_host_alloc 传递进来的是一个struct scsi_host_template 指针,<br />
而返回的确是一个struct <strong>Scsi</strong>_Host 指针?首先,这两个结构体包含很多相同的元素,但又不完全相同,它<br />
们<br />
协同工作,互相关联,但是各自起的作用不一样,struct <strong>Scsi</strong>_Host 结构体中有一个成员,就是一个struct<br />
scsi_host_template 指针,它就指向和它相关联的那个template,而struct scsi_host_template 中很<br />
多个函数指针,它们的参数就是struct <strong>Scsi</strong>_Host 的指针.所以这之间的关系千丝万缕,剪不断理还乱,藕断<br />
丝还连.一点不亚于曹禺先生的中那复杂的人物关系,唯一的差别只是这里没有乱伦关系罢了.<br />
好了,就这些,这种复杂的关系我们不需要去完全了解,我们要做的只是知道今后我们有且仅有一个struct<br />
<strong>Scsi</strong>_Host 有且仅有一个struct scsi_host_template 就可以了.<br />
108<br />
至此,我们终于走到了usb_stor_acquire_resources()中第801行,即将见到这个千呼万唤始出来的<br />
内核精灵.<br />
彼岸花的传说(一)<br />
彼岸花,花语是悲伤的回忆.<br />
很久很久以前,城市的边缘开满了大片大片的曼珠沙华,它的花香有一种魔力,可以让人想起自己前世的事<br />
情.守护曼珠沙华的是两个妖精,一个是花妖叫曼珠,一个是叶妖叫沙华.他们守侯了几千年,可是从来没有见<br />
过面,因为开花的时候,就没有叶子,有叶子的时候没有花.他们疯狂地想念着彼此,并被这种痛苦折磨着.终<br />
于有一天,他们决定违背神的规定偷偷地见一次面.那一年的曼珠沙华红艳艳的花被惹眼的绿色衬托着,开得<br />
格外妖冶美丽.<br />
曼珠和沙华受到惩罚,被打入轮回,并被诅咒永远也不能在一起,生生世世在人世间受到磨难.从那以后,蔓<br />
珠沙华又叫彼岸花,意思是开放在天国的花,它的花的形状像一只只在向天堂祈祷的手掌,可是再也没有在这<br />
个城市出现过.每年的秋彼岸期间(春分前后三天叫春彼岸,秋分前后三天叫秋彼岸)她会开在黄泉路上,曼珠<br />
和沙华的每一次转世在黄泉路上闻到彼岸花的香味就能想起前世的的自己,然后发誓不分开,但只有在这一<br />
刻,因为他们会再次跌入诅咒的轮回,灵魂籍由着这花的指引,走向幽冥……<br />
而为了纪念这个美丽而又忧伤的传说,Linux 内核中引入了守护进程,也正是与这个传说对应,守护进程也<br />
叫内核精灵,当然,如果你觉得人们都太迷信,而你是共产党员,是无神论者,那么ok,你可以叫它为内核线程.<br />
事实上我也是无神论者,不过我只敢在白天承认这一点.我们来看具体的代码.<br />
801行,调用了kernel_thread()函数,kernel_thread(usb_stor_control_thread, us, CLONE_VM),<br />
并将返回值用一个整型变量p 来表示,如果从前您对内核本身不是很熟悉,那这个函数就会让您有点头疼<br />
了.<br />
这个函数将会创建一个内核线程,而函数usb_stor_control_thread()将会执行,us 将是传递给她的参<br />
数,CLONE_VM 只是设定的一个flag,对Linux 内核不是很熟悉的话,可以将kernel_thread 看作类似于<br />
fork 的冬冬,什么?fork 您也不知道?好吧.不知道就不知道,只是依稀记得在那毕业求职的日子里,很多外<br />
企<br />
的笔试面试中都会问起fork,问一些关于她的返回值的问题,印象中,2004 年维尔软件的校园招聘笔试中考<br />
过,后来我去Sun 中国工程研究院面试也被问起过. 实际上,简单一点说,kernel_thread()这么一执行呢,<br />
就会有两个进程,一个是父进程,一个是子进程,子进程将会执行usb_stor_control_thread(),而us 是作<br />
为usb_stor_control_thread 函数的参数(实参),CLONE_VM 标志表征父子进程之间共享地址空间,执<br />
行<br />
完usb_stor_control_thread()之后,子进程就结束了,她会调用exit()函数退出.而父进程继续顺着