网卡本身是有内存的,每个网卡一般都有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页面寄存器