資源描述:
《Linux網(wǎng)卡驅(qū)動(dòng)程序分析.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、(轉(zhuǎn))Linux網(wǎng)卡驅(qū)動(dòng)程序分析 學(xué)習(xí)應(yīng)該是一個(gè)先把問(wèn)題簡(jiǎn)單化,再把問(wèn)題復(fù)雜化的過(guò)程。一開(kāi)始就著手處理復(fù)雜的問(wèn)題,難免讓人有心驚膽顫,捉襟見(jiàn)肘的感覺(jué)。讀Linux網(wǎng)卡驅(qū)動(dòng)也是一樣。那長(zhǎng)長(zhǎng)的源碼夾雜著那些我們陌生的變量和符號(hào),望而生畏便是理所當(dāng)然的了。不要擔(dān)心,事情總有解決的辦法,先把一些我們管不著的代碼切割出去,留下必須的部分,把框架掌握了,那其他的事情自然就水到渠成了
2、,這是筆者的心得。 一般在使用的Linux網(wǎng)卡驅(qū)動(dòng)代碼動(dòng)輒3000行左右,這個(gè)代碼量以及它所表達(dá)出來(lái)的知識(shí)量無(wú)疑是龐大的,我們有沒(méi)有辦法縮短一下這個(gè)代碼量,使我們的學(xué)習(xí)變的簡(jiǎn)單些呢?經(jīng)過(guò)筆者的不懈努力,在仍然能夠使網(wǎng)絡(luò)設(shè)備正常工作的前提下,把它縮減到了600多行,我們把暫時(shí)還用不上的功能先割出去。這樣一來(lái),事情就簡(jiǎn)單多了,真的就剩下一個(gè)框架了。 下面我們就來(lái)剖析這個(gè)可以執(zhí)行的框架。 &
3、nbsp; 限于篇幅,以下分析用到的所有涉及到內(nèi)核中的函數(shù)代碼,我都不予列出,但給出在哪個(gè)具體文件中,請(qǐng)讀者自行查閱。 首先,我們來(lái)看看設(shè)備的初始化。當(dāng)我們正確編譯完我們的程序后,我們就需要把生成的目標(biāo)文件加載到內(nèi)核中去,我們會(huì)先ifconfigeth0down和rmmod8139too來(lái)卸載正在使用的網(wǎng)卡驅(qū)動(dòng),然后insmod8139too.o把我們的驅(qū)動(dòng)加載進(jìn)去(其中8139too.o是我們編譯生成的目標(biāo)文件)。就
4、像C程序有主函數(shù)main()一樣,模塊也有第一個(gè)執(zhí)行的函數(shù),即module_init(rtl8139_init_module);在我們的程序中,rtl8139_init_module()在insmod之后首先執(zhí)行,它的代碼如下: staticint__initrtl8139_init_module(void) { returnpci_module_init(&rtl
5、8139_pci_driver); } 它直接調(diào)用了pci_module_init(),這個(gè)函數(shù)代碼在Linux/drivers/net/eepro100.c中,并且把rtl8139_pci_driver(這個(gè)結(jié)構(gòu)是在我們的驅(qū)動(dòng)代碼里定義的,它是驅(qū)動(dòng)程序和PCI設(shè)備聯(lián)系的紐帶)的地址作為參數(shù)傳給了它。rtl8139_pci_driver定義如下: staticstructpci_driverrtl8139_pci_dri
6、ver={ name:MODNAME, id_table:rtl8139_pci_tbl, probe:rtl8139_init_one,  
7、;remove:rtl8139_remove_one, }; pci_module_init()在驅(qū)動(dòng)代碼里沒(méi)有定義,你一定想到了,它是Linux內(nèi)核提供給模塊是一個(gè)標(biāo)準(zhǔn)接口,那么這個(gè)接口都干了些什么?筆者跟蹤了這個(gè)函數(shù),里面調(diào)用了pci_register_driver(),這個(gè)函數(shù)代碼在Linux/drivers/pci/pci.c中,pci_register_driver做了三件事情。 ①是把帶過(guò)來(lái)的參數(shù)rtl813
8、9_pci_driver在內(nèi)核中進(jìn)行了注冊(cè)。內(nèi)核中有一個(gè)PCI設(shè)備的大的鏈表,這里負(fù)責(zé)把這個(gè)PCI驅(qū)動(dòng)掛到里面去。 ②是查看總線上所有PCI設(shè)備(網(wǎng)卡設(shè)備屬于PCI設(shè)備的一種)的配置空間,如果發(fā)現(xiàn)標(biāo)識(shí)信息與rtl