1.只考虑接收包的场景
2.只考虑简单的不带 DMA 功能的网卡
3.网卡带一个输入缓冲队列
假设刚开始缓冲队列是空的。下面是我的理解:
当第一个包进入到输入缓冲队列的时候,网卡产生一个中断。CPU 进入中断处理函数。首先第一条指令就是屏蔽中断(原子操作,一条汇编指令)。然后处理包,主要的处理动作是把它 copy 到内存中。处理完后关中断(也是原子操作,一条汇编指令)
假设在处理过程中,来了第二个包,因为屏蔽了中断,包是不是只会放到缓冲队列?第一个包处理完后,怎么处理第二个中断丢失的包呢?我看有些驱动的处理函数在每个包处理完后,似乎都会检查一下网卡缓冲队列中是否还有包,但这样检查是原子操作吗?不会放过任何包吗?假设在检查之后,关中断之前来了一个包呢?
2.只考虑简单的不带 DMA 功能的网卡
3.网卡带一个输入缓冲队列
假设刚开始缓冲队列是空的。下面是我的理解:
当第一个包进入到输入缓冲队列的时候,网卡产生一个中断。CPU 进入中断处理函数。首先第一条指令就是屏蔽中断(原子操作,一条汇编指令)。然后处理包,主要的处理动作是把它 copy 到内存中。处理完后关中断(也是原子操作,一条汇编指令)
假设在处理过程中,来了第二个包,因为屏蔽了中断,包是不是只会放到缓冲队列?第一个包处理完后,怎么处理第二个中断丢失的包呢?我看有些驱动的处理函数在每个包处理完后,似乎都会检查一下网卡缓冲队列中是否还有包,但这样检查是原子操作吗?不会放过任何包吗?假设在检查之后,关中断之前来了一个包呢?