天天看點

詳細透徹的分析DM9000網卡驅動程式(1)

轉載位址:http://blog.csdn.net/bingqingsuimeng/article/details/6940276

         自己感覺前段時間的學習,一直是東一榔頭,西一棒子,是以決定聽“趙磊”大哥的話:這個世界太浮躁,需要靜下心來做點兒學問。于是,哥們鼓起勇氣開始分析linux核心中的dm9000驅動程式

1.網絡相關的程式在linux代碼中的層次機構

         從哥們第一天進公司起,就讓哥們開始整理**代碼,我以為,整理代碼應該是從一個較高的層次去整理,隻有對整個代碼的架構,設計流程了解了,才能算的上是去整理。

是以,什麼東西都是經曆過後,才能明白其中的奧秘,不是有句叫做:一覽衆山小嘛,是以,我将先從從一個高的層次,或者說一個抽象的層次,來闡述一下網絡相關的東西(重點讨論驅動程式)在linux核心中的層次結構

詳細透徹的分析DM9000網卡驅動程式(1)

                                                                                                                                         圖一

      好的,你看到了,我們的裝置驅動程式是處于實際硬體裝置層之上的一層,是以,也算起到了承上啟下的作用,它是在核心空間的,真個linux核心代碼有相當大的一部分就是裝置驅動程式。

2.實際的網絡的傳遞過程

       下面,我們說一下實際的網絡包究竟經過怎樣一個流程從使用者空間發送到驅動,再到實際的硬體裝置的,或者怎樣由實際的裝置接收之後,經由裝置驅動層傳遞到使用者空間的。上圖。。。

詳細透徹的分析DM9000網卡驅動程式(1)

                                                                                                                                 圖二

          好了,這下你清楚了吧?嗯?看不明白?好吧,怎麼說哥們既然決定講了,就将它個翻天覆地,透透徹徹。。。

          (1)接收過程,如上如,網絡上的資料包到達網卡後,網卡産生中斷,然後裝置驅動層收到中斷後,開始進行網絡包的接收,接收完之後調用一個netif_rx函數交給網絡協定層(層次結構上圖一),然後就是一層一層的網上傳到使用者空間了

          (2)發送過程,從使用者空間過來的資料包,經過層層穿越之後,到達網絡協定層,然後調用一個dev_queue_xmit()函數之後就不管了,剩下的交給驅動層經過處理後,使用函數hard_start_xmit()函數發送,然後硬體上網卡開始發送資料包了

           這就是整個過程,如果你還是不明白,額。。。那麼我隻能建議你看看《計算機網絡》謝老爺子寫的那本,第四版或者第五版都行,如果你對中斷這塊兒的機制不了解,額。。。可以看看單片機相關的東西,其實,通俗的講,中斷就是一種機制,什麼機制呢,舉個例子就是,假如你正在上課,忽然同學打電話給你,此時,你呢,上課的狀态就先斷了,而要先接聽電話,這就是一種中斷,當然,實際的各種硬體裝置的中斷要比這個複雜,比如儲存現場了等等,基本上是這個意思,中斷是一種機制,這種機制有利于提高工作效率,還拿剛才的上課舉例子,你總不能上課時一直在看有沒有電話打來吧,你需要設定鈴聲,等電話來了通知你。。。好了。。如果說你還是不太明白。。哥啊。。咱問“百哥”或是“谷姐”吧。。

3:dm9000網卡驅動在linux中的實際設計思想.39.1”,沒有為什麼選擇這個版本,哥們随便找了個新的就看了,但是,還是有一個原因,好像都有“喜新厭舊”的習慣吧。。。哈哈哈。。雖然是linux3.0也已經出來了,但哥們既然選擇了2.6.39這條路一定要堅持下去,什麼?你問我建議你下載下傳哪個版本啊?額。。還是最新吧。。最新的展現了最新的思想,不要總是活在過去哦。。呵呵。。

          好了,扯淡到此為止,分析馬上開始。。。。開始上圖。。。

詳細透徹的分析DM9000網卡驅動程式(1)

圖三

       看見這兩個檔案了嗎?看了哈。。嗯。。。這就是我們分析的重點連個檔案。。。嗯?在哪?額。。。\linux-2.6.39.1\drivers\net 目錄下。。。不要告訴哥們你不會用source insight昂,嗯?你真不會,好吧。。哥們隻能勉為其難的告訴你這是一個檢視代碼的好工具。。剩下怎麼用。。你可以去問“百哥”了。。

       好了,我們打開dm9000.c 一共2056行。。嗯。。不多。。在我們的征服範圍之内。。。嗯?什麼?你嫌多?唉。。其實我也嫌多啊。。我恨不得就一行。。。不過,像咱 這農二代,這點苦還是要吃的的。。好歹說哥們參加工作的第一個項目也寫了2000多行代碼呢。。

      好了。。還是上圖吧。。不然你會說我啰嗦了。。雖然本來就是有點兒啰嗦。。哈哈。。

  1

詳細透徹的分析DM9000網卡驅動程式(1)

     嗯。。相信你自己。。你沒看錯。。是從最後一行往上走的。。為什麼?鐵道部發言說了。。“我隻能說這是一個奇迹”,難怪linux都是一個奇迹。。。大家都知道對于應用程式,我們一般習慣于找main函數,然後開始分析,不過對于驅動,哥們隻能拿告訴你,沒有main函數,那我們開始從哪分析呢。。。答案是:module_init,子產品初始化函數,這才是驅動程式的入口,當然還有一個它的清理函數module_exit

繼續閱讀