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

  按照圓方的建議,悟空打開了無線驅動的debugfs功能。悟空通過模擬大數據通信的場景,測試了一個多小時候,發現無線果然不再發送數據了。悟空查看了debugfs之後,發現發送隊列的狀態位和802.11協議棧的狀態出現了衝動。發送隊列的狀態爲顯示爲802.11協議棧沒有掛起,而802.11協議棧的狀態卻是掛起的狀態。這讓悟空怎麼也想不通,所以悟空再次找到了圓方。

  悟空曰:從測試的結果來看,發送隊列的狀態位,和802.11協議棧的狀態位沒有對應上。那麼是什麼原因導致了沒有對應起來呢?圓方,你怎麼看呢?

  圓方曰:我們先來分析一下發送的掛起流程。


  從這個圖中我們可以看出設置802.11狀態爲的掛起和真正掛起802.11網絡協議棧,其實是由兩步組成的,所以我分析猜測,應該是在這兩步之間被其他的程序修改了狀態位的值。

  悟空曰:不可能啊,程序中雖然是由兩步組成,但是在這兩部之間設計人員已經加入了自旋鎖啊。加入自旋鎖之後按理來說,是不應該被打斷的啊,難道是靈異事件。圓方,你怎麼看呢?

  圓方曰:自旋鎖的使用分很多種方法的,而且自旋鎖是不能被進程和軟中斷打斷,但是卻可以被中斷打斷。因此如果在這兩步之間插入一箇中斷,而且這個中斷還修改了狀態位的值,就會出現我們現在測試的情況。

  悟空曰:那麼怎樣才能不讓中斷打斷呢?

  圓方曰:其實很簡單,可以直接使用關中斷自旋鎖。

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