class="22269">
--------------------------------------------------------------------------------
7.;技術信息
對於那些想了解更多有關網卡如何工作、或如何使用現有驅動程序,以及試圖為目前不支持的網卡編寫自己的驅動程序的人來說,這些信息應該會有用。如果你沒有這種想法,那麼最好跳過這一節。;
7.1;可編程I/O、共享內存與DMA;
如果已經可以發送接收背靠背數據包,就無法把更多的數據放到網絡上。每一個現代以太網卡都可以接收背靠背數據包。Linux的DP8390驅動程序(wd80x3、SMC-Ultra、3c503、ne2000,等等)非常接近於發送背靠背數據包(依賴於當前的中斷延遲),3c509和AT1500的硬件在自動發送背靠背數據包上沒有一點問題。;
可編程I/O(如NE2000、3c509)
優點:沒有使用任何受限制的系統資源,只用了若干I/O寄存器,而且沒有16M的限制。;
缺點:一般傳輸速率較慢,CPU需要等待,幾乎不可能訪問交叉的數據包。;
共享內存(如WD80x3、SMC-Ultra、3c503)
優點:簡單,比可編程I/O速度快,允許隨機訪問數據包。在可能的情況下,Linux驅動程序在從網卡復制出接收的IP數據包時計算其校驗和,從而比相應的PIO網卡進一步減少了對CPU的占用。;
缺點:占用內存空間(對DOS用戶來說是個大問題,在Linux下沒有問題),依然要占用CPU。;
從屬(普通)的直接內存存取(Linux下沒有這種情況!)
優點:在實際數據傳遞過程中不占用CPU。;
缺點:檢查邊界條件、分配相鄰的緩存和DMA寄存器編程使該方法成為最慢的技術。它還占用了一個珍貴的DMA通道,並要求對齊的低端內存緩存。;
總線控制的直接內存存取(如LANCE、DEC;21040)
優點:在數據傳輸過程中不占用CPU,可以把緩存串起來,CPU時間很少或沒有花費在ISA總線上。大多數總線控制的Linux驅動程序現在使用一種“copybreak”方案,較大的數據包直接從網卡放進內核的網絡緩存,小的數據包被CPU復制到cache裡進行下一步的處理。;
缺點:(只適用於ISA總線的網卡)網卡要求低端內存緩存和一個DMA通道。任何總線控制器在與其它強占總線的總線控制器,如某些古老的SCSI適配器,一起工作時都會出問題。有幾個設計低劣的主板芯片組在與總線控制器一起使用時也有麻煩。不使用任何類型的DMA設備的一個原因是使用了為代替386設計的486處理器插件:這些處理器在每個DMA周期都必須刷新cache。(這其中包括Cx486DLC、Ti486DLC、Cx486SLC、Ti486SLC,等等。);
7.2;涉及總線帶寬的性能;
ISA總線能達到5.3MB/sec;(42Mb/sec),聽起來對10Mbps以太網是足夠了。對於100Mbps網卡,顯然需要更快的總線以利用網絡帶寬。;
8比特ISA網卡與16比特ISA網卡
你可能不會再買一個新的8比特ISA以太網卡了,但在隨後幾年間你會在計算機物物交換市場一類的地方發現很多很便宜的這種卡。這使得它們在“家用以太網”系統中很常見。對於16比特的ISA網卡來說也是一樣的,因為現在PCI卡已經很普遍了。;
對於較低或平均的應用,一些可以提供足夠性能的8比特網卡是wd8003、3c503和ne1000。3c501的性能較差,而且要避免使用那些12年前XT時代的低性能紀念品。(可以把它們送給Alan,他在收集這種網卡......);
8比特的數據通道不會對性能造成太大損害,你依然可以從一個較快主機上的8比特wd8003網卡(使用快的ISA總線)上獲得大約500到800kB/s的ftp下載速度。如果你的所有網絡流量幾乎都是來自遠端站點,那麼數據通道上的瓶頸將發生在其它地方,只有在進行本地子網操作時你才會注意到不同網卡間的速度差別。;
7.3;32比特(VLB/EISA/PCI)以太網卡;
注意,10Mbs網絡通常並不一定要求32比特的接口。參見;可編程I/O、共享內存與DMA以了解為什麼8MHz的ISA總線上的10Mbps以太網卡並非真正的瓶頸。盡管使用快的總線的以太網卡並不一定帶來更快的數據傳輸,但會減少CPU負載,這對多用戶系統來說是件好事。當然,對於現在普通的100Mbps網絡,32比特接口是充分使用全部帶寬的必要條件。;
7.4;編寫驅動程序;
在Linux下使用以太網卡所必需的只不過是相應的驅動程序。因此,關鍵是制造商要向公眾公開編程的技術資料,而無需你(或其他什麼人)簽署什麼協議。關於獲取資料的可能性(也許你不編寫代碼,那麼就是其他人編寫你確實需要的驅動程序的可能性),一個較好的指南是Crynwr;(昵稱Clarkson)的包驅動程序的可用性。Russ;Nelson在干這些事,對開發Linux驅動程序很有幫助。網上沖浪者可以試著用下面的URL看一下Russ的軟件。;
Russ;Nelson's;Packet;Drivers
有了資料,就可以為網卡編寫驅動程序並在Linux下使用(至少從理論上來說是這樣)。記住,有些為XT一類機器設計的老式硬件在Linux這樣的多任務環境下工作得不是很好。如果網絡流量較大,使用這些網卡會帶來大麻煩。;
大多數網卡都帶有如NDIS和ODI一類的MS-DOS接口的驅動程序,但對Linux沒有用。許多人建議直接鏈接它們或自動翻譯一下,但這幾乎是不可能的。MS-DOS驅動程序需要工作在16比特模式,並依賴於“軟件中斷”,這二者與Linux內核不兼容。這種不兼容實際上是Linux的一個特性,有些Linux驅動程序比其相應的MS-DOS驅動程序要好得多。比如“8390”系列驅動程序使用乒乓傳送緩存,該方法剛剛被引進MS-DOS。;
(乒乓傳送緩存意味著為傳送數據包使用至少兩個最大大小的包緩存。在網卡發送其中的一個時,載入另一個。在第一個包被發出去後,立刻發送第二個包,依次類推。這樣,大多數網卡就可以連續向線路上發送背靠背數據包。);
好啦。你可以決定為Foobar;Ethernet網卡編寫驅動程序了,因為你有編程資料,而且還沒人寫這個驅動程序。(......這是兩個主要的需求;;-);你可以從Linux內核源碼樹中提供的網絡驅動程序框架開始。在所有近期的內核裡都能找到這個文件/usr/src/linux/drivers/net/skeleton.c。在2.4.x(或更新的)內核裡已經把它重新命名為isa-skeleton.c。也可以看看如下URL的Kernel;Hackers;Guide:;KHG
7.5;內核的驅動程序接口;
下面對編寫一個新驅動程序所必需的函數進行了若干說明。和上面提到的驅動程序框架一起閱讀可以更清楚一些。;
Probe
在啟動時調用以檢查網卡存在與否。如果可以通過讀取內存等非強制手段進行檢查最好。也可以從I/O端口讀取。在探測開始向I/O端口寫不好,因為這樣可能會損害另一個設備。通常在這裡還進行一些設備初始化(分配I/O空間、IRQ、填充dev->???域等等)。必須了解網卡可以配置到哪些I/O端口/內存、如何啟用共享內存(如果用了的話)以及如何選擇/啟用中斷產生,等等。;
Interrupt;handler
在網卡發出一個中斷時內核調用的程序。它需要確定網卡發出中斷的原因並進行相應的操作。一般的中斷條件是接收到數據、發送完成、報告出錯狀況。需要了解相關的中斷狀態位以進行相應的操作。;
Transmit;function
與dev->hard_start_xmit()鏈接,在內核想通過設備傳送數據時調用它。該函數把數據放入網卡並觸發傳送。需要了解如何把數據打包並傳給網卡(共享內存拷貝、PIO傳送、DMA?),以及放入網卡正確的位置。然後需要了解如何通知網卡把數據發送到線路上,(可能)在發送完成後發出一個中斷。在硬件無法接收更多數據包時需要設置dev->tbusy標志。在網卡有空間可用時,一般這發生在傳送完成中斷過程中,清除dev->tbusy標志並用mark_bh(INET_BH)通知上一層。;
Receive;function
在網卡報告有數據時由內核中斷處理程序調用。它把數據從網卡上移出,放入一個sk_buff並通過執行netif_rx(sk_buff)告訴內核數據所在位置。需要了解如何在接收數據時啟用中斷生成,如何檢查相關的接收狀態位,以及如何從網卡獲取數據(通過共享內存拷貝、PIO、DMA,等等)。;
Open;function
與dev->open鏈接,在有人使用ifconfig;eth0;up時網絡層調用它——把設備連到線路上並啟用來接收/發送數據。任何在探測過程中(啟用IRQ生成函數等)沒有完成的特別的初始化操作都在這裡進行。;
Close;function;(可選)
在有人使用ifconfig;eth0;down時使網卡進入一個清醒的狀態。如果硬件許可的話它會釋放中斷和DMA通道,並完全關閉以節約能源(象收發器一樣)。;
Miscellaneous;functions
如同一個重新設置函數,如果事情變得很糟,驅動程序可以試圖重新設置網卡作為最後防線。一般在發送超時或類似情況下如此進行。也是一個讀取網卡統計寄存器的函數,如果是這樣配備的話。;
7.6;3Com的技術信息;
如果對3Com網卡驅動程序的工作感興趣,可以從3Com公司獲取技術資料。Cameron在下面友好地告訴了我們該如何去做:;
在我們的“技術參考文獻”(TRs)裡給出了3Com的以太網適配器驅動程序程序員需要了解的資料。這些手冊描述了板上的程序員接口,但沒有提及診斷、安裝程序等終端用戶所看到的東西。;
網絡適配器分部的市場部有技術參考資料分發。為了使這個計劃更有效,我們把它集中到一個稱作“CardFacts”的自動電話系統裡。你可以打電話來,然後它把資料傳真給你。要索取技術參考資料,打電話到408-727-7021。索取開發人員的訂單,資料號是9070。在打電話前准備好你的傳真號碼。填完訂單後把它傳真到408-764-5004。手冊會由聯邦速遞的次日服務送到。;
有人認為我們的手冊不該免費,他們也在尋找此系統過於昂貴或占用的時間和努力太多的證據。到目前為止,3Com的顧客確實不錯,向我們提出的要求也很合理。我們需要你