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