详细透彻的分析DM9000网卡驱动程序(3)
? ? ? ? 以前,聽過有一首歌叫做《誰是誰的誰》,好像還不錯,世界這么大,你我各自走著自己的精彩的人生,到底誰是誰的誰呢?就像啟東事件,就像什錦事件,還是有好多人知道自己是誰的誰,抗議了那些不知道自己是誰的人。震撼,敬佩。
? ? ? ? ?本節繼續上次說到那幾個結構體,那么他們的作用究竟是什么呢?直接上代碼:
? ? ? ? ?
? ? ? ? ? ? ? ?最基本的解釋在上面了,表層的解釋,第一印象,這也是人們選美的第一個標準。就想前不久,重慶環球小姐大賽出爐,海南小姐選美大賽出爐之后,遭到網友的吐槽,亂罵聲,這分明是在挑戰中國的傳統審美觀嘛,無奈只好重選。實踐證明第一印象很重要的,該是什么就是什么,不要欺騙普通屌絲大眾啊。
? ? ? ? ?第1604行,分配一個網絡設備,但是傳進去的大小讓我們很好奇唉,為什么是板子板子相關的數據的大小呢?我去。。好吧。。作為一個有探索精神的人,咱們進去看看:
? ? ? ??
? ? ? ? 尼瑪坑爹啊,沒直接進去,有出來一個函數alloc_etherdev_mq,好吧,再次ctrl+鼠標左鍵
? ? ? ? 我了個去,又調了另外一個函數?好吧。。進入
?
? ? ? ? ? ? ? ? ? ? ?我了個去,還有這么一層?好吧。。我只能說,這才是為人民服務的公仆,你看看表面平靜的alloc_etherdev函數,實際內心是多么的波瀾壯闊啊。這才是人民的公仆,無論人家內心是怎樣的哈,但是人是公仆啊,公仆就要為人民提供便利,就像xxx和尚哈?人也是公仆啊,人度化了多少女子哈?而且還是那樣度化的。唉,這個年頭,表面看來很簡單的事情,確實蘊含著復雜深刻的道理啊。你再比如劉翔這次110米欄,這在運動員的生涯中是多么普通的一件事情啊,但就是越是看起來簡單,其實越復雜。
? ? ? ? ? ?我們看到英文的解釋是這樣的:
? ? ? ? ? ?alloc_etherdev_mqs這個函數分配并且初始化一個網絡設備,其中參數sizeof_priv是要分配的附加的驅動私有結構體的大小,當然這個結構體是要為我們的網絡設備服務的
? ? ? ? ? ?txqs這個設備有的接收隊列的數量,rxqs當然就是發送隊列的數量
? ? ? ? ? ?這個函數使用基本的網絡設備的值填充了設備結構體,其實做了除了注冊這個網絡設備之外的所有的基本的事情,猜也知道這小子干了不小事兒啊。
? ? ? ? ? ?再次進入,我了個去。。有點兒長啊。。唉,別怕,有我在呢。。神馬都是浮云。咱們繼續
? ? ? ? ? ?
? ? ? ? ? ? ? 額。。咱們一點兒點兒的進行啊。。
? ? ? ? ? ? ? 先解釋一下英文注釋:alloc_netdev_mqs分配一個網絡設備 ,其中參數sizeof_priv是要分配的私有數據的大小,name是設備名字格式化的字符串 ,setup是初始化設備的回調函數,txqs和rxqs還是那連個隊列的數量。
? ? ? ? ? ? 5782行, 限制了名字的長度,那么最大是多少呢?告訴你是16,原因在struct net_device中dev的name是一個長度為16數組,為了避免一下子層次太過與深入,暫時不解釋struct net_device,我就知道它就是一個網絡設備
? ? ? ? ? ?5782行,發送隊列的數量不能小于1,繼續貼代碼:
? ? ? ? ? ?
? ? ? ? ? ?5791行 如果定義了CONFIG_RPS這個選項,那么接收隊列的數量也不能小于1。這個選項是什么意思呢?Receive Flow Steering接收流轉向,應該是網絡協議棧相關的東西,暫時不去關心。
? ? ? ? ? 5800-5808行 計算struct net_device的大小加上私有數據的大小,并做一個32位的對齊
? ? ? ? ? 5810-5813行 分配上述大小的空間給p做了一個對齊,內核在某些應用中,為了實現某種機制,比如分頁,或者提高訪問效率需要保證數據或者指針地址對齊到某個特定的整數值,比如連接代碼腳本。這個值必須是2N。數據對齊,可以看做向上圓整的一種運算。內核提供了兩個用來對齊的宏ALIGN和PTR_ALIGN,一個實現數據對齊,而另一個實現指針的對齊。它們實現的核心都是__ALIGN_MASK,其中mask參數為低N位全為1,其余位全為0的掩碼,它從圓整目標值2N?- 1得到。
? ? ? ? ? ??并且計算了一下對齊之后多出的大小放在padded成員中。
總結
以上是生活随笔為你收集整理的详细透彻的分析DM9000网卡驱动程序(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring @Aspect切面参数传递
- 下一篇: C#鼠标右键弹出菜单