網絡協議棧15:網卡接收/發送數據基礎知識


網卡本身是有內存的,每個網卡一般都有4K以上的內存,用來發送,接收數據。

 

數據在從主內存搬到網卡之后,不是立即就能被發送出去的,而是要先在網卡自身的內存中排隊,再按照先后順序發送;同樣的,數據從以太網傳遞到網卡時,網卡也是先把數據存儲到自身的內存中,等到收到一幀數據了,再經過中斷的方式,告訴主CPU(不是網卡本身的微處理器)把網卡內存的數據讀走,而讀走后的內存,又被清空,再次被使用,用來接收新的數據,如此循環往復。

 

而網卡本身的內存,又多是按照256字節為1頁的方式,把所有內存分頁,之后把這些頁組成隊列,大致的結構如圖:

 

一般會划分一小部分頁面作為發送數據用的,大部分用於接收網絡數據,大致如圖:

藍色部分為發送數據用的頁面總和,總共只有6個頁面用於發送數據(40h~45h);剩余的46h~80h都是接收數據用的,而在接收數據內存中,只有紅色部分是有數據的,當接收新的數據時,是向紅色部分前面的綠色中的256字節寫入數據,同時“把當前指針”移動到+256字節的后面(網卡自動完成),而現在要讀的數據,是在“邊界指針”那里開始的256字節(紫色部分),下一個要讀的數據,是在“下一包指針”的位置開始的256字節,當256字節被讀出來了,就變成了重新可以使用的內存,即綠色所表示,而接收數據,就是把可用的內存拿來用,即變成了紅色,當數據寫到了0x80h后,又從0x46h開始寫數據,這樣循環,如果數據滿了,則網卡就不能再接收數據,必須等待數據被讀出去了,才能再繼續接收。

 

下面是一些網卡常用的寄存器:

CR(command register)---命令寄存器

TSR(transmit state register)---發送狀態寄存器

ISR(interrupt state register)----中斷狀態寄存器

RSR(receive state register)---接收狀態寄存器

RCR(receive configure register)---接收配置寄存器

TCR(transmit configure register)---發送配置寄存器

DCR(data configure register)---數據配置寄存器

IMR(interrupt mask register)---中斷屏蔽寄存器

NCR(non-coding region)---包發送期間碰撞次數

FIFO(first in first out)

CNTR0(counter register)--- 幀同步錯總計數器

CNTR1---CRC錯總計數器

CNTR2---丟包總計數器

PAR0~5(physical address register)---本地MAC地址

MAR0~7(multiple address register)---多播地址匹配

PSTOP(page stop register)---結束頁面寄存器

PSTART(page start register)---開始頁面寄存器

BNRY(boundary register)----邊界頁寄存器

CURR(current page register)---當前頁面寄存器

CLDA0,1(Current Local DMA Address)---當前本地DMA寄存器

TPSR(Transmit page start register)---傳送頁面開始寄存器

TBCR0,1(transmit byte counter register)---傳送字節計數寄存器

CRDA0,1(current remote DMA address)---當前遠程DMA寄存器

RSAR0,1(remote start address register)---遠程DMA起始地址寄存器

RBCR0,1(remote byte counter register)---遠程字節計數寄存器

BPAGE(BROM page register)---BROM頁面寄存器

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM