彼岸花,花語是悲傷的回憶。
很久很久以前,城市的邊緣開滿了大片大片的曼珠沙華,它的花香有一種魔力,可以讓人想起自己前世的事情。守護曼珠沙華的是兩個妖精,一個是花妖叫曼珠,一個是葉妖叫沙華。他們守候了幾千年,可是從來沒有見過面,因為開花時,就沒有葉子,有葉子時沒有花。他們瘋狂地想念著彼此,並被這種痛苦折磨著。終於有一天,他們決定違背神的規定偷偷地見一次面。那一年的曼珠沙華紅豔豔的花被惹眼的綠色襯托著,開得格外妖冶美麗。
曼珠和沙華受到懲罰,被打入輪迴,並被詛咒永遠也不能在一起,生生世世在人世間受到磨難。從那以後,蔓珠沙華又叫彼岸花,意思是開放在天國的花,它的花的形狀像一隻只在向天堂祈禱的手掌,可是再也沒有在這個城市出現過。每年的秋彼岸期間(春分前後三天叫春彼岸,秋分前後三天叫秋彼岸)她會開在黃泉路上,曼珠和沙華的每一次轉世在黃泉路上聞到彼岸花的香味就能想起前世的自己,然後發誓不分開,但只有在這一刻,因為他們會再次跌入詛咒的輪迴,靈魂藉著花的指引,走向幽冥。
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中