網卡工作原理

來源:互聯網
上載者:User

標籤:

網卡工作原理

Linux作業系統的功能可以概括為進程管理、記憶體管理、檔案系統管理、裝置管理、網路等幾部分。所有的系統操作最終都可以映射到對物理裝置的操作。除去對CPU、記憶體以及其他少數幾個物理實體的操作之外,系統對其他裝置的所有操作都通過專門的稱為驅動程式的程式碼完成。系統中存在的每種外設在核心中都必須有對應的裝置驅動程式對其進行處理。所以分析網卡的工作原理即是分析網卡的驅動程式。

網路是獨立的一個模組。為了屏蔽網路環境中物理網路裝置的多樣性,Linux對所有的裝置進行抽象並定義了一個統一的概念,稱之為介面。所有對網路硬體的訪問都是通過介面進行的,介面提供了一個對所有類型的硬體一致化的操作集合來處理基本資料發送和接收。一個網路介面被看作是一個發送和接收資料包的實體。對於每個網路介面,都用一個net_device的資料結構來表示。net_device中有很多提供系統訪問和協議層調用的裝置方法,包括提供裝置初始化和往系統註冊用的init函數,開啟和關閉網路裝置的open和stop函數,處理資料包發送的函數hard_start_xmit,以及中斷處理函數。

所有被發送和接收的包都用資料結構sk_buff表示。要發送資料時,網路系統將分局系統路由表選擇相應的網路介面進行資料轉送;當接收資料包時,通過驅動程式登記的中斷服務程式進行資料的介面處理。

Linux網路驅動程式崇尚倒下分為四層:協議介面層、網路裝置介面層、裝置驅動功能層、網路裝置和網路媒介層。如所示:

 

 

網卡初始化

網路裝置初始化主要工作時檢測裝置的存在、初始化描述裝置的net_device結構及在系統中登記該裝置。在系統初始化完成以後,系統檢測到的網路裝置將儲存在鏈表dev_base中,其中每個鏈表單元net_device對應一個存在的物理網路裝置。

初始化過程首先檢測網路物理裝置是否存在,這是通過檢測物理裝置的硬體特徵來完成;然後對裝置進行資源配置,這些完成之後就要構造裝置的net_device資料結構,用檢測到值對net_device中的變數初始化;最後Linux核心中註冊該裝置並申請記憶體空間。

 

網卡的開啟與關閉

為了使用網路裝置,需要開啟網卡,開啟和關閉的一個介面是由shell命令ifconfig調用的,而ifconfig則要調用一個通用的裝置開啟函數dev_open(net/core/dev.c),相應的還有一個dev_close函數,這兩個函數提供獨立於裝置的操作介面的開啟和關閉功能。一般開啟函數執行的操作包括註冊中斷函數,分配並初始化網卡所需要的接收與發送緩衝區,啟動硬體檢查網路連接線狀態等。

 

資料包的發送與接收

資料包的發送和接收是實現Linux網路驅動程式中兩個最關鍵的過程。

當物理網路裝置接收到資料是,系統通過兩種途徑解決這個問題。一種方法是輪詢方式,另一種方式是中斷法師。

在輪詢方式中,系統每隔一定的時間間隔就去檢查一次物理裝置,若裝置有資料到達,就調用讀取資料的程式。Linux中通過定時器實現,但是此法有一個明顯的缺點:不管裝置是否有資料,系統總是要固定的消耗CPU資源去查看裝置,並且可能對一些緊急資料處理予以延遲。從資源的利用率以及工作的效率上看都不是最優的。

中斷方式利用硬體體繫結構的中斷機制實現裝置和系統的應答對話,即當物理裝置需要CPU處理資料時,就向CPU發送一個終端訊號,系統則在收到訊號後調用相應的中斷服務程式響應對裝置中斷的處理。因此,基本在所有的網路裝置驅動程式中都是用中斷方式的。

每一個網卡上都有一塊FIFO儲存空間,對於NIC(Network Interface Controller),FIFO儲存空間是用來通過系統匯流排傳送資料到系統儲存空間之前,緩衝從LAN上接收到的資料。對與快速乙太網路還有一個直接記憶體存取(DMA:Directly Memory Access)控制器,用於提供對系統儲存空間的可靠訪問。

驅動為網卡分配一個環形緩衝區,在一段連續的實體記憶體中實現。

1、  資料接收

(1)       接收來自MAC的資料包,先暫存於片內FIFO接收隊列;

(2)       當接收器達到早期接收上線時就移至環形緩衝區;

(3)       待整個資料包全部從FIFO移至緩衝後,將接收狀態寄存器和包長度寫入接收的資料包頭部,並更新CBA(Current Buffer Address)寄存器的值;

(4)       CMD(Command)寄存器中的BufferEmpty位和ISR(中斷狀態寄存器)寄存器的ROK位置1,並發出ROK的中斷;

(5)       ISR中斷調用完成後,清除ISR(ROK)並更新CAPR(Current Address of Packet Read,指向接收緩衝的已讀取包的地址),完成本次接收。

2、  資料發送

(1)       將待傳送的資料寫入主存中一段連續的緩衝空間,由OS配合驅動程式完成;

(2)       找到一個可用的描述器,並寫入內容,包括該資料包的開始物理地址和傳輸狀態字(包的大小、可傳送下限、OWN位);

(3)       OWN位有效,將資料從緩衝移至片內FIFO隊列;

(4)       當FIFO隊列中的資料達到早期傳送下限,NIC的傳送單元就會啟動,將資料順序輸出至線路;

(5)       當整個資料包都已經傳至FIFO,OWN位置1;

(6)       當整個資料包都已經傳至線路上, TOK寄存器置1;

(7)       當TOK(IMR)和TOK(ISR)多置1,就發出TOK中斷;

(8)       TOK中斷調用完成以後,清除TSD狀態字,完成本次傳送。

 

可以看出,網卡需要發送/接收資料,都必須以中斷的方式告訴系統,系統處理中斷後做出相應操作。

網卡存在一定大小的FIFO儲存空間,同時還有緩衝區,緩衝區是由系統以及驅動共同分配一段連續的實體記憶體,所有的發送/接收的資料,都必須通過FIFO已經緩衝區,只有一包資料都發送成功後,才能繼續發送下一包資料。系統維護緩衝區,只有當緩衝區有空間時才會接受上層來的資料,而網卡處理資料的速率遠高於接收資料的最大速率,因此在網卡上不會存在堵塞情況。

對編程而言,在應用程式層調用傳輸層函數send/sendto,使用通訊端傳送資料,屏蔽了底層的所有實現。此時,send/sendto函數是沒有阻塞的,只要調用,必然有傳回值,成功返回傳送資料的長度,失敗則返回負值(失敗的主要原因是網路連接的問題),因此可能存在資料丟失的現象,需要寫程式的時候保證資料的傳輸成功。但是只有send/sendto函數返回後,程式才會執行下一次發送,因此編程時沒必要考慮資料會在傳輸層上出現阻塞。

網卡工作原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.