Next Previous Contents

8. 技朮信息

對于那些想了解更多有關網卡如何工作、或如何使用現有驅動程序,以及 試圖為目前不支持的網卡編寫自己的驅動程序的人來說,這些信息應該會 有用。如果你沒有這種想法,那么最好跳過這一節。

8.1 可編程I/O、共享內存與DMA

如果已經可以發送接收背靠背數據包,就無法把更多的數據放到網絡上。 每一個現代的以太網卡都可以接收背靠背數據包。Linux的DP8390驅動程序 (wd80x3、SMC-Ultra、3c503、ne2000,等等)基本上都可以發送背靠背 數據包(依賴于當前的中斷延遲),3c509和AT1500的硬件在自動發送背靠 背數據包上沒有一點問題。

ISA總線可以達到5.3MB/sec (42Mb/sec),對10Mbps以太網而言已經足夠了。 對于100Mbps網卡,顯然需要更快的總線來充分利用網絡帶寬。

可編程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,等等。)

8.2 編寫驅動程序

在Linux下使用以太網卡所必需的只不過是相應的驅動程序。因此,關鍵是 制造商要向公眾公開編程的技朮資料,而無需你(或其他什么人)簽署什 么協議。關于獲取資料的可能性(也許你不編寫代碼,那么就是其他人編 寫你確實需要的驅動程序的可能性),一個較好的指南是Crynwr (昵稱 Clarkson)的包驅動程序的可用性。Russ Nelson在干這些事,對開發Linux 驅動程序很有幫助。網上沖浪者可以試著看一下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。也可 以看看如下URL的Kernel Hackers Guide: KHG

8.3 內核的驅動程序接口

下面對編寫一個新驅動程序所必需的函數進行了若干說明。和上面提到的 驅動程序框架一起閱讀可以更清楚一些。

探測

在啟動時調用以檢查網卡存在與否。如果可以通過讀取內存等非強制手段 進行檢查最好。也可以從I/O端口讀取。在探測開始向I/O端口寫不好, 因為這樣可能會損害另一個設備。通常在這里還進行一些設備初始化(分 配I/O空間、IRQ、填充dev->???域等等)。必須了解網卡可以配置到哪 些I/O端口/內存、如何啟用共享內存(如果用了的話)以及如何選擇/啟用 中斷產生,等等。

中斷處理程序

在網卡發出一個中斷時內核調用的程序。他需要確定網卡發出中斷的原因 并進行相應的操作。一般的中斷條件是接收到數據、發送完成、報告出錯 狀況。需要了解相關的中斷狀態位以進行相應的操作。

傳送函數

與dev->hard_start_xmit()鏈接,在內核想通過設備傳送數據時調用它。 該函數把數據放入網卡并觸發傳送。需要了解如何把數據打包并傳給網卡 (共享內存拷貝、PIO傳送、DMA?),以及放入網卡正確的位置。然后需 要了解如何通知網卡把數據發送到線路上,(可能)在發送完成后發出一 個中斷。在硬件無法接收更多數據包時需要設置dev->tbusy標志。在網 卡有空間可用時,一般這發生在傳送完成中斷過程中,清除dev->tbusy 標志并用mark_bh(INET_BH)通知上一層。

接收函數

在網卡報告有數據時由內核中斷處理程序調用。它把數據從網卡上移出, 放入一個sk_buff并通過執行netif_rx(sk_buff)告訴內核數據所在位置。 需要了解如何在接收數據時啟用中斷生成,如何檢查相關的接收狀態位, 以及如何從網卡獲取數據(通過共享內存拷貝、PIO、DMA,等等)。

打開函數

與dev->open鏈接,在有人使用ifconfig eth0 up時網絡層調用它 ──把設備連到線路上并啟用來接收/發送數據。任何在探測過程中(啟用 IRQ生成等)沒有完成的特別的初始化操作都在這里進行。

關閉函數(可選)

在有人使用ifconfig eth0 down時使網卡進入一個清醒的狀態。如果 硬件許可的話它會釋放中斷和DMA通道,并完全關閉以節約能源(象收發器 一樣)。

雜項函數

如同一個重新設置函數,如果事情變得很糟,驅動程序可以試圖重新設置 網卡作為最后防線。一般在發送超時或類似情況下如此進行。也是一個讀 取網卡統計寄存器的函數,如果是這樣配備的話。

8.4 3Com的技朮信息

如果對3Com網卡驅動程序的工作感興趣,可以從3Com公司獲取技朮資料。 Cameron友好地告訴了我們該如何去做:

在我們的“技朮參考文獻”(TRs)里給出了3Com的以太網適配器驅動程序 程序員需要了解的資料。這些手冊描述了板上的程序員接口,但沒有提及 診斷、安裝程序等終端用戶所看到的東西。

網絡適配器分部的市場部有技朮參考資料分發。為了使這個計划更有效, 我們把它集中到一個稱作“CardFacts”的自動電話系統里。你可以打電話 來,然后它把資料傳真給你。要索取技朮參考資料,打電話到408-727-7021。 索取開發人員的訂單,資料號是9070。在打電話前准備好你的傳真號碼。 填完訂單后把它傳真到408-764-5004。手冊會由聯邦速遞的次日服務送到。

有人認為我們的手冊不該免費,他們也在尋找此系統過于昂貴或占用的時 間和努力太多的証據。到目前為止,3Com的顧客確實不錯,向我們提出的 要求也很合理。我們需要你們的繼續合作并把這樣的服務維持下去。

8.5 基于AMD PCnet/LANCE的網卡的注意事項

AMD的LANCE(以太網的局域網控制器)是最早提供的,已經被“PCnet-ISA” 芯片所取代,否則又名為79C960。注意,名稱“LANCE”有毛病,有些人會 用老名稱稱呼新芯片。AMD的網絡產品分部的Dave Roberts友好地提供了下 面有關該芯片的信息:

“從功能上來看,它等同與NE1500。它的寄存器組與使用附加1500/2100結 構的老式LANCE一樣。PCnet-ISA可以使用較早的1500/2100驅動程序。NE1500 和NE2100的結構基本上是相同的。開始Novell把它稱為2100,但后來想區 分同軸電纜與10BASE-T網卡。屬于10BASE-T的就只采用1500范圍的編號。 這是僅有的區別。

許多公司提供基于PCnet-ISA的產品,包括HP、Racal-Datacom、Allied Telesis、 Boca Research、Kingston Technology等等。除了有些制造商增加了“無 跳線”特性允許軟件配置網卡外,這些網卡基本上都是一樣的。大多數制 造商沒有增加這一特性。AMD提供了一個使用PCnet-ISA的網卡的標准設計 軟件包,許多制造商不加改變地直接使用我們的設計。這也就是說,如果 想編寫大多數基于PCnet-ISA的網卡的驅動程序,只需要從AMD獲取數據資 料。打電話給我們的資料分發中心(800)222-9323,索取PCnet-ISA的數據 資料Am79C960。這是免費的。

要迅速了解一塊網卡是否“標准”網卡只需要看一下它。如果是標准的, 網卡上只有一塊大的芯片、一塊晶振、一塊小的IEEE地址PROM、可能還有 一個啟動ROM的插座和一個連接器(依照提供的媒介選項可能是1、2或3)。 注意,如果是同軸電纜網卡,卡上就應該有一些收發器緩存,它們靠近連 接器,遠離PCnet-ISA。”

一個可能的網卡黑客需要注意,不同的LANCE產品采用不同的“重起”方法。 有些恢復到上次離開網絡環路的地方,另一些則從環路的開頭開始,就象 剛被初始化一樣。

8.6 廣播與混雜模式

Donald所做的另一個工作是實現廣播與混雜模式的鉤子。所有發布的 (即不是ALPHA的)ISA驅動程序現在都支持混雜模式。

Donald寫道:“我准備從討論混雜模式開始,它從概念上來說很容易實現。 對大多數硬件,你只需要設置一個寄存器位,然后就可以接收到線路上的 每一個數據包。對,差不多就這么簡單﹔對有些硬件,你必須先關閉板卡 (可能會丟失若干數據包),重新配置它,然后重新啟用以太網卡。對吧, 就這么簡單,下面要討論的就不是這么明顯了:廣播模式。它可以用兩種 方式實現:

  1. 使用混雜模式和一個如Berkeley包過濾器(BPF)的數據包過濾器。 BPF是一個模式匹配指令語言,可以編寫一個程序挑出感興趣的地址。它的 優點在于它很普遍和可編程。其缺點是沒有一個一般性的方法可以讓內核 避免打開混雜模式和通過每一個注冊的包過濾器運行每一個線路上的數據 包。參見 Berkeley包過濾器以了解更多信息。
  2. 使用絕大多數以太網芯片內建的廣播包過濾器。

我想應該列出几個以太網卡/芯片提供的廣播包過濾器:

        
        芯片/網卡       混雜模式  廣播包過濾器
        ----------------------------------------
        Seeq8001/3c501  Yes     Binary filter (1)
        3Com/3c509      Yes     Binary filter (1)
        8390            Yes     Autodin II six bit hash (2) (3)
        LANCE           Yes     Autodin II six bit hash (2) (3)
        i82586          Yes     Hidden Autodin II six bit hash (2) (4)
        

  1. 這些網卡聲稱有一個過濾器,但只是簡單地對“accept all multicast packets”或“accept no multicast packets”回答yes/no。
  2. AUTODIN II是標准的以太網CRC校驗多項式。在這種方式下,廣播地址 被哈希運算后在哈希表里進行查找。如果啟用了相應的比特位,則數據包 被接收。以太網數據包的設計使得硬件在如此處理時的開銷很小──(一 般)只要在前6個八進制數(目標地址)之后鎖定CRC電路(用來進行錯誤 檢查)的6個比特位,把它們作為哈希表的索引(6比特──一個64比特的 表)。
  3. 這些芯片使用6比特哈希,必須由主機計算并載入哈希表。這也就是說 內核必須包含CRC代碼。
  4. 82586內部使用6比特哈希,但是由自己從接受的廣播地址列表計算出 哈希表。

注意,這些芯片的過濾效果都不好,還需要一個中間層次的模塊完成最后 的過濾。同時還要注意,在每種情況下都必須保持一個完整的接受廣播地 址列表,在出現變化時以重新計算哈希表。

8.7 Berkeley包過濾器(BPF)

開發者普遍認為BPF的功能不該由內核提供,而是放在一個(但愿很少使用 的)兼容庫里。

對不了解的人來說:BPF(Berkeley包過濾器)是一種向內核網絡層說明對 哪些數據包感興趣的機制。它是用一種建立在底層網絡代碼中的特殊指令 語言解釋器實現的。應用程序把一個用這種語言編寫的程序傳遞給內核, 然后內核對每一個接收到的數據包執行該程序。如果內核有多個BPF應用程 序,對每個數據包都要運行這几個程序。

問題在于很難從數據包過濾器程序推斷出應用程序實際上對哪一種數據包 感興趣,所以一般的解決方法就是始終運行過濾器。假設一個應用程序注 冊的BPF程序是獲取發往某個廣播地址的低速數據流。絕大多數以太網卡有 一個64個入口的哈希表的硬件實現的廣播地址過濾器,用來忽略大多數不 想要的廣播數據包,所以有可能以極低的開銷完成這一操作。但是由于有 了BPF,內核必須把接口設置為混雜模式,接收所有數據包,并對它們運行 過濾器。不管怎樣,這樣確實可以工作,但考慮到對所要求的數據包進行 的處理,就已經變得過于麻煩了。


Next Previous Contents