Total Pageviews

Saturday 27 October 2012

网卡的工作机制

每一个网卡上都有一块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已经缓冲区,只有一包数据都发送成功后,才能继续发送下一包数据。系统维护缓冲区,只有当缓冲区有空间时才会接受上层来的数据,而网卡处理数据的 速率远高于接收数据的最大速率,因此在网卡上不会存在堵塞情况。

参考:
http://blog.chinaunix.net/uid-25839577-id-3035405.html