![当连接以太网电缆时,Linux 内部到底发生了什么?](https://linux22.com/image/63712/%E5%BD%93%E8%BF%9E%E6%8E%A5%E4%BB%A5%E5%A4%AA%E7%BD%91%E7%94%B5%E7%BC%86%E6%97%B6%EF%BC%8CLinux%20%E5%86%85%E9%83%A8%E5%88%B0%E5%BA%95%E5%8F%91%E7%94%9F%E4%BA%86%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我想了解当电缆连接到以太网端口时到底发生了什么(假设动态 IP 寻址):
- 正在运行哪些服务以及如何触发它们?
- 需要调用哪些 API 才能建立连接?
额外问题:连接电缆时如何准确检测信号(我知道这个问题可能不完全适合这个 SE 站点)?
答案1
我只能真正回答“额外的问题”。 “连接电缆时如何检测信号”。因此,假设 10*/Base-T,设备会检测到一种载波信号,并将该信息提供给设备驱动程序。设备驱动程序通常会通过内核记录器发送一条消息“ETHX:LINK DETECTED”。该信息也可以在 /sys 层次结构中获得(在相对较新的 Linux 版本中)。看https://stackoverflow.com/a/808599/3849157。
我相信 udev 规则可以配置为在设备状态更改时触发操作。但我不确定这里是否是这种情况。
如果 dhclient/pump 进程正在运行并且它执行其操作,则该进程将请求 DHCP 地址,如果它从 DHCP 服务器获取一个地址,则通常会调用一个或多个实际配置操作系统网络的帮助程序脚本。但这取决于执行此操作的特定程序。
答案2
内核有一个驱动程序,适用于端口所在的任何总线(PCI、USB、PCMCIA——实际上,后者更复杂,没有人再使用它,所以忘记 PCMCIA)。该驱动程序已将该总线上的寄存器(这与 CPU 寄存器不同)映射到内存并监视它们。
当插入电缆时,以太网硬件会更改其寄存器并通知总线。总线消息 udev,它将总线 ID 映射到适当的驱动程序(这也可能发生在内核中;取决于它的设置方式)。 Udev 还可能通过 dbus 唤醒像 Pump 或 NetworkManager 这样的用户态进程,尽管这正在进入“取决于它如何设置”的领域。
一般来说,udev 已经设置了诸如端口的符号名称“eth1”或其他什么的映射,以及它使用的驱动程序,并且它使这些信息可供用户空间的其余部分(在某些情况下还包括内核)使用。它监听内核中的总线软件,以了解总线上设备的更改——这与自动挂载 USB 记忆棒的方式非常相似:总线与 udev 通信,udev 与用户空间通信。
长话短说:以太网端口上的硬件与总线(PCI 或 USB 或其他总线)通信,然后与 udev 通信,udev 与用户空间的其余部分通信。