电脑接收网络数据依次经过网卡驱动和协议栈程序,以DM9000A网卡为例进行介绍接收数据的过程。
网卡在一个数据包到来时,会产生一个硬中断,网络驱动程序会执行中断处理过程:首先申请一个skb结构及pktlen加5大小的内存用于保存数据,然后便将接收到的数据从网卡复制到这个skb的数据部分中。当数据从网卡中成功接收后,调用netifrx进一步处理数据,将skb加入到相应的inputpktqueue队列中,并调用netifrxschedule,会产生一个软中断来执行网络协议栈的例程。这样,中断的上半部已完成,以下的工作则交由中断的下半部来实现。
下半部的内核守护线程dosoftirq,将执行netrxaction,对数据进行处理。IP层输入处理程序轮询处理输入队列中的每个IP数据,在整个队列处理完毕后返回。处理IP选项,验证IP主机地址和正确性等,并调用相应协议处理程序。