当连接以太网电缆时,Linux 内部到底发生了什么?

当连接以太网电缆时,Linux 内部到底发生了什么?

我想了解当电缆连接到以太网端口时到底发生了什么(假设动态 IP 寻址):

  1. 正在运行哪些服务以及如何触发它们?
  2. 需要调用哪些 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 与用户空间的其余部分通信。

相关内容