《Linux那些事儿之我是USB》我是U盘(22)彼岸花的传说(一)

来源:岁月联盟 编辑:exp 时间:2011-10-23

 

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

 

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

 

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

 

Linux内核中引入了守护进程,也正是与这个传说对应,守护进程也叫内核精灵,当然,如果你是无神论者,你可以叫它为内核线程。我们来看具体的代码。

 

799行,调用了kthread_create()函数,kthread_create(usb_stor_control_thread, us, "usb-storage"),如果从前您对内核本身不是很熟悉,那这个函数就会让你有点儿头疼了。这个函数将会创建一个内核线程,而函数usb_stor_control_thread()将会执行,us将是传递给它的参数,对Linux内核不是很熟悉的话,可以将kthread_create看做类似于fork的函数。

 

实际上,简单一点说,kthread_create()这么一执行呢,就会有两个进程,一个是父进程,一个是子进程,子进程将会执行usb_stor_control_thread(),而us是作为usb_stor_control_thread函数的参数(实参),执行完usb_stor_control_thread()之后,子进程就结束了,它会调用exit()函数退出。而父进程继续顺着usb_stor_acquire_resources()函数往下走,kthread_create()函数对于父进程而言返回的是子进程的进程task_struct结构体指针,800行调用IS_ERR(th)判断返回的指针是否是错误代码,若是IS_ERR(th)为真,则调用PTR_ERR(th)读出实际的错误代码。

 

于是,咱们接下来必须再次兵分两路,分别跟踪父进程和子进程前进了。先看父进程,811行:

 

811  wake_up_process(th);

 

唤醒子进程,之所以需要唤醒子进程,是因为当你用kthread_create()创建一个子进程之后,它并不会立即执行,它要等待你唤醒了之后才会执行,所以这个函数就相当于田径运动中裁判的发令声。运动员跑得再快,他也要等到裁判发令声之后才会开始跑。那么我们来看子进程,也就是usb_stor_control_thread()函数,这个函数定义于drivers/usb/storage/usb.c中