我正在链接networkkernel.pdf
上阅读了解linux网络内部一书以及Linux内核空间中的pdf 网络数据包捕获在主题9.2.2 下的了解linux网络内部 中,它被赋予了
处理输入框架的代码分为两部分:首先,驱动程序将帧复制到内核可访问的输入队列中,然后内核对其进行处理(通常将其传递给专用于关联的处理程序) IP等协议。第一部分在中断上下文中执行,可以抢占第二部分的执行。
现在查询是在第二部分安排的时候?谁安排他们?调用是在中断处理程序中给出的吗?在 Linux内核空间中的网络数据包捕获中,数据包输入流程描述为: -
When working in interrupt driven model, the nic registers an
interrupt handler;
• This interrupt handler will be called when a frame is received;
• Typically in the handler, we allocate sk buff by calling
dev alloc skb();
• Copies data from nic’s buffer to this struct just created;
• nic call generic reception routine `netif_rx();`
• `netif rx()` put frame in per cpu queue;
• if queue is full, drop!
• net rx action() decision based on skb->protocol;
• This function basically dequeues the frame and delivery a copy
for every protocol handler;
• ptype all and ptype base queues
我想知道什么时候netif rx();和net rx action()被调用?谁叫他们我的意思是谁安排他们。
请指导。
答案 0 :(得分:0)
此调度由NAPI
结构完成。 Packets由所描述的方法分解。当存在“活锁”问题或数据包溢出时,这种情况就会出现;这些是handled。
数据包出口比数据包入口复杂得多,实现了队列管理和QOS(甚至可能是数据包整形)。 “Queue Discplines”用于实现用户可指定的QOS policies。
NAPI结构安排:
对于NAPI结构,defined为;它的司机Design & Hardware Architecture。
Linux使用ksoftirqd作为一般解决方案来安排softirq在下一次中断之前运行并将它们置于调度程序控制之下。这也可以防止连续的softirq独占CPU。这也会导致在运行CPU密集型应用程序和网络时需要考虑ksoftirq的优先级,以实现softirq /用户平衡的适当平衡。据报道,将ksoftirq优先级提高到0(最终更多)可以解决高CPU负载下网络性能低的问题。
还有一篇关于NAPI Scheduling的研究论文。