Mah*_*koe 1 apache hardware networking linux-device-driver linux-kernel
这是一个模糊的问题,因为我自己的理解也同样模糊。我感兴趣的是网络电缆上的零星电压需要发生什么才能导致计算机上运行的程序执行某些操作。
假设我在我的网络服务器上运行 apache2。有人在自己的联网计算机上触发了正确的事件序列,从而导致网络数据到达服务器。然后呢?
我的猜测是主板上有一些外围组件可以侦听数据,然后在 CPU 中引发中断。不知何故,在中断服务例程中,Linux 必须要求 apache2 代码做一些事情。这样对吗?如果是这样,有人愿意分享一些额外的细节吗?
谢谢
我将概述自下而上发生的事情,并尽可能引用代码。
以太网卡(NIC)接收并解码线上的信号,并将其推入移位寄存器
当接收到完整的以太网帧时,它被放入硬件中的接收 (RX) 队列中
IRQ 可以被多个设备共享。内核必须弄清楚哪个设备实际上正在中断。我将提到e100.c驱动程序,因为它是在一个 C 文件中实现的,并且得到了很好的评论。
request_irq。(见for_each_action_of_desc()中__handle_irq_event_percpu())。e100_intr())看到 NIC 确实中断了。它禁用设备中断(例如e100_disable_irq())并安排 NAPI 回调(__napi_schedule())。NIC 驱动程序通过返回IRQ_HANDLED. 中断结束。e100_poll),它从 NIC RX 队列中读取数据包并将其放入struct sk_buff(SKB)中,并将其推送到内核网络堆栈中(例如e100_rx_indicate())。出于性能原因,整个 TCP/IP 堆栈在 Linux 内核中实现:
e100_indicate())。ip_rcv())tcp_v4_rcv())。tcp_v4_rcv()调用__inet_lookup_skb())匹配。如果是SYN包(新连接):
accept通话中被阻塞的任务——或者select如果不是SYN包(有数据):
recv调用阻塞的任务- 或select( sock_def_readable())Apache ( httpd) 将被唤醒,具体取决于它被阻塞的系统调用:
accept()当新的子连接可用时返回(这是用一个名为 的包装器处理的apr_socket_accept())
recv() 当套接字有新数据时返回,该数据已被读入用户空间缓冲区