一篇文章告诉你:Linux 网络驱动 网络卡原理 它们之间怎么互动?
报价宝综合消息一篇文章告诉你:Linux 网络驱动 网络卡原理 它们之间怎么互动?
驱动和网络卡的互动过程很少人会关注,但是如果你懂这方面的知识,会对使用者态的网络程式设计更加理解深刻和通透。

驱动和网络卡之间是异步通讯。驱动在请求传送资料之后CPU就去干别的事情去了。网络卡传送完包之后通过中断通知CPU,CPU再通过驱动程式了解到结果。和传送资料一样,接收资料也是异步的。网络卡把资料倒腾到主存之后再通过中断通知CPU。
因此,预留一些空间来快取传送和接受的buffer是必要的。大多数情况下,网络卡使用环结构,这个环基本上就是一个伫列,它具有固定的条目数,每一个条目储存一个传送或者接受的资料。条目被顺序的轮流使用,可以复用。如下图所示,可以看到资料传送过程。
传送资料流
驱动接收上层的资料并建立一个网络卡可以理解的资料包描述(send descriptor),包含了主存地址和大小。由于网络卡只认识实体地址,所以驱动还需将虚拟地址转换成实体地址,之后把send descriptor放到Tx ring之中。下一步通过通知网络卡有新的资料了,之后网络卡通过DMA(直接内存访问)获取元资料和资料传送出去。传送完之后通过DMA把结果写回,之后传送中断通知。
资料的接收和传送反推过程差不多,自己看图:

不多说了,自己看图也能理解了。
本片文章内容非常精简,但不代表知识量少,大家可能也发现了源理君的文章篇幅不是很长,但会把知识讲清楚、明白。