网络协议栈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页面寄存器

 

posted on 2012-01-17 17:03  image eye  阅读(4333)  评论(0编辑  收藏  举报