悟空學Linux專欄----第41篇

  爲了儘快解決這個問題,悟空打算好好的研究一下該無線的驅動程序,悟空先花費了一晚的時間統計了一下驅動程序,總文件數爲55個,總的代碼行數爲45954行。統計完之後悟空開始研究驅動的代碼,可是看來看去,悟空都無法看出這些代碼有什麼問題,這讓悟空頭大,悟空打算問問圓方有什麼好的思路。

  悟空:我看了一下驅動代碼,沒有發現這段代碼沒有什麼問題啊?圓方你怎麼看呢?

  圓方:如果我們要找出問題的所在,我們先要分析該代碼的結構,執行流程,看看無線到底卡在了什麼地方。我昨晚好好看了一下代碼的執行流程,畫出了下面的代碼的架構框圖。

    

  從我昨晚研究的結果看,數據發送的流程大概是這樣的。當系統有數據需要發送的時候,先將數據發送給802.11協議棧,802.11協議棧先判斷是否被掛起,如果沒有怎將數據傳遞給驅動程序的發送隊列,發送同時判斷髮送隊列中的數據是否超過了水平線,如果超過了則發送掛起信號給802.11協議棧,否則則不會發送掛起信號。而當發送完成之後,硬件會觸發一箇中斷,該中斷服務器例程會觸發我們昨天討論的tasklet,由發送的tasklet將發送隊列中的數據傳遞給硬件,同時判斷髮送隊列中的空閒元素是否高於水平線,如果高於則判斷802.11協議棧是否掛起,如果掛起怎喚醒。

  悟空:哇,這個設計已經很完美了啊,按理來說部應該再有什麼問題了啊?圓方,你怎麼看呢?

  圓方:完美是很完美,但是你沒發現嗎,如果發送隊列掛起了,而中斷又不喚醒,那麼不就數據永遠也發送不出去了嗎?

  悟空無語。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章