《Linux那些事兒之我是USB》我是U盤(22)彼岸花的傳說(一)
彼岸花,花語是悲傷的回憶。
很久很久以前,城市的邊緣開滿了大片大片的曼珠沙華,它的花香有一種魔力,可以讓人想起自己前世的事情。守護曼珠沙華的是兩個妖精,一個是花妖叫曼珠,一個是葉妖叫沙華。他們守候了幾千年,可是從來沒有見過面,因為開花時,就沒有葉子,有葉子時沒有花。他們瘋狂地想念著彼此,並被這種痛苦折磨著。終於有一天,他們決定違背神的規定偷偷地見一次面。那一年的曼珠沙華紅豔豔的花被惹眼的綠色襯托著,開得格外妖冶美麗。
曼珠和沙華受到懲罰,被打入輪迴,並被詛咒永遠也不能在一起,生生世世在人世間受到磨難。從那以後,蔓珠沙華又叫彼岸花,意思是開放在天國的花,它的花的形狀像一隻只在向天堂祈禱的手掌,可是再也沒有在這個城市出現過。每年的秋彼岸期間(春分前後三天叫春彼岸,秋分前後三天叫秋彼岸)她會開在黃泉路上,曼珠和沙華的每一次轉世在黃泉路上聞到彼岸花的香味就能想起前世的自己,然後發誓不分開,但只有在這一刻,因為他們會再次跌入詛咒的輪迴,靈魂藉著花的指引,走向幽冥。
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行:
喚醒子程序,之所以需要喚醒子程序,是因為當你用kthread_create()建立一個子程序之後,它並不會立即執行,它要等待你喚醒了之後才會執行,所以這個函式就相當於田徑運動中裁判的發令聲。運動員跑得再快,他也要等到裁判發令聲之後才會開始跑。那麼我們來看子程序,也就是usb_stor_control_thread()函式,這個函式定義於drivers/usb/storage/usb.c中。811 wake_up_process(th);
相關推薦
【轉】Linux那些事兒 之 戲說USB(6)我是一棵樹(一)
什麼是USB controller?在一個USB系統中只能有一個host,其實說白了就是咱們的主機,而USB和主機的介面就是host controller,你的主機總不可能只能有一個USB host controller吧,所以說一個主機可以支援多個host controller,比如分別屬於不同廠商的。那麼
【轉】Linux那些事兒 之 戲說USB(15)繁華落盡
臺灣作家林清玄在接受記者採訪時,如此評價自己的30多年寫作生涯:“第一個十年我才華橫 溢,‘賊光閃現’,令周邊黯然失色;第二個十年,我終於‘寶光現形’,不再去搶風頭,反而與身邊的美麗相得益彰;進入第三個十年,繁華落盡見真醇,我進入 了‘醇光初現’的階段,真正體味到了境界之美。
【轉】Linux那些事兒 之 戲說USB(4)漫漫辛酸路
70 config USB_OHCI_HCD71 tristate "OHCI HCD support"72 depends on USB && USB_ARCH_HAS_OHCI73 select ISP1301_OMAP if MACH_OM
Linux那些事兒 之 戲說USB(12)從這裡開始
任小強們說房價高漲從現在開始,股評家們說牛市從5000點開始。他們的開始需要我們的錢袋,我的開始只需要一臺電腦,最好再有一杯茶,伴著幾支小曲兒,不盯著錢總是會比較愜意的。生容易,活容易,生活不容易,因為
【轉】Linux那些事兒 之 戲說USB(3)PK
最初的設計目標就是替代序列、並行等各種低速匯流排,以達到以一種單一型別的匯流排連線各種不同的裝置。它現在幾乎可以支援所有連線到PC上的裝置,99年提出的USB2.0理論上可以達到480Mbps的速度。它與串列埠、並口等的這場PK從一開始就是不平等的,這樣的開始註定了以什麼樣的結果結束,只能說命運選擇了USB。
《Linux那些事兒之我是USB》我是U盤(22)彼岸花的傳說(一)
彼岸花,花語是悲傷的回憶。 很久很久以前,城市的邊緣開滿了大片大片的曼珠沙華,它的花香有一種魔力,可以讓人想起自己前世的事情。守護曼珠沙華的是兩個妖精,一個是花妖叫曼珠,一個是葉妖叫沙華。他們守候了幾千年,可是從來沒有見過面,因為開花時,就沒有葉子,有葉子時沒有花。他們瘋狂
《Linux那些事兒之我是USB》我是U盤(29)彼岸花的傳說(八)
對於use_sg為0的情況,我們接下來再看168行,offset是函式呼叫傳遞進來的引數,註釋裡說得很清楚,就是用來標誌偏移量的,每次複製幾個位元組它就增加幾個位元組,最大它也不能超過request_bufflen,這是顯然的。usb_stor_access_xfer_bu
《Linux那些事兒之我是USB》我是U盤(21)傳說中的URB
有人問,怎麼寫一個驅動寫這麼久啊? 的確,一路走來,大家都不容易,但既然已經走到今天,我們能做的也只有是堅持下去。 usb_stor_acquire_resources(),從名字上來看是獲取資源。什麼是資源?之前不是申請了一大堆記憶體了嗎?寫個USB裝置驅動程式怎麼這麼麻
Linux那些事兒之我是U盤(49)跟著感覺走(一)
,fake_senseneed_auto_sense,sense,..,,fake_sense1.1.,usb_stor_sense_invalidCDB,? 讓我們把鏡頭對準drivers/usb/storage/scsiglue.c, 479 /* To Report
Linux那些事兒之我是SCSI硬碟(4)三座大山(一)
好不容易結束了sd_spinup_disk(),馬上我們就遇到了三座大山.它們是sd_read_capacity(),sd_read_write_protect_flag(),sd_read_cache_type(),要繼續往下看,我們不得不先推翻這三座大山.舊的三座大山
Linux那些事兒之我是Hub(17)八大重量級函式閃亮登場(一)
還有人記得1996年那部史詩般的電視劇<<英雄無悔>>嗎?那年我初二.這部戲讓我認識了濮存昕,也是這部戲確立了濮存昕少婦殺手的地位,後來大肆那年濮存昕去過復旦,宣傳艾滋病方面的知
Linux那些事兒之我是Block層(4)濃縮就是精華?(一)
人,生在床上,死在床上;欲生欲死,還是在床上.這句話非常有道理.有人說它有點俗,但,我並不這麼認為.我因為經常坐在床上一邊看A片一邊看程式碼,所以對這句話體會頗深,事實上它形象的描述了我坐在床上看程式碼時複雜的心情,說欲生欲死,一點也不誇張,尤其是當我看到add_disk
Linux那些事兒 之 我是PCI(4)初始化(一)
解析完了PCI的那些核心引數,再翻過多少座山跨過多少條河,核心就會遇到init/main.c裡一個名叫do_initcalls的函式。do_initcalls對核心來說只不過是漫長冒險旅程中的一個驛站,對PCI這個故事來說卻是命運轉輪的開始,核心在它裡邊完成了對.initca
[Linux]CentOS 7之下載、製作U盤系統盤篇
轉載請註明出處:http://blog.csdn.net/qq_26525215 本文源自【大學之旅_諳憶的部落格】 下載CentOS映象: 下載這個CentOS映象的方式有很多種,這這裡只介紹2種比較好的下載連結網址與方式。 第一種: 進入http://centos.ust
分散式事務那些事兒之TCC
一、TCC簡介 TCC是一種比較成熟的分散式事務解決方案,可用於解決跨庫操作的資料一致性問題; TCC是服務化的兩階段程式設計模型,其Try、Confirm、Cancel 3個方法均由業務編碼實現; 其中Try操作作為一階段,負責資源的檢查和預留,Confirm操作作為二階段提交操作,執
細說網路那些事兒之網路基本功(一):細說網路傳輸
網路基本功(一):細說網路傳輸 常言道:欲練神功,必先練好基本功。之前做了一個關於IP路由,預設閘道器和掩碼的問答貼,做完這個帖子覺得如果對網路知識點做一個系統的闡述,應該會很有幫助。 本系列文章著重於講解網路管理實際應用中常常涉及的重要知識點,儘量以實用為主。準備
談談領域模型的那些事兒 之 從領域獲取知識
前言:你寫過用例模型嗎?也許有;你寫過領域模型嗎?也許還沒有。在這裡,我們可以嘗試寫寫領域模型,看看它的作用、帶給我們的好處。 隨著RUP在中國的傳播,人們開始嘗試用RUP統一過程來指導軟體的設計和開發,但這些嘗試並不成功。比較普遍的,大家都開始使用用例模型來進行需求階段的
JDK原始碼那些事兒之淺析Thread上篇
JAVA中多執行緒的操作對於初學者而言是比較難理解的,其實聯想到底層作業系統時我們可能會稍微明白些,對於程式而言最終都是硬體上執行二進位制指令,然而,這些又太過底層,今天來看一下JAVA中的執行緒,淺析JDK原始碼中的Thread類,之後能幫助我們更好的處理執行緒問題 前言 JDK版
簡單實現stm32f103晶片usb模擬U盤進行IAP更新使用者程式
轉自:https://blog.csdn.net/lrmlrm/article/details/51507340 更新微控制器內的使用者程式,方式一般都是模擬器,串列埠,網路口,usb DFU,另類一點CAN也行,但是這些方式都有一個共同點,必須要有相應的上位機配合操作,還要教會別人使用
linux網路程式設計之用socket實現簡單客戶端和服務端的通訊(基於TCP)
一、介紹基於TCP協議通過socket實現網路程式設計常用API 1、讀者如果不是很熟悉,可以先看我之前寫的幾篇部落格,有socket,地址結構的理解,更加方便讀者理解 地址分別是: 2、socket(TCP)程式設計API簡介 1)、socket int s