網卡本身是有內存的,每個網卡一般都有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頁面寄存器