我们已经谈了很多关于网络接口和通用 TCP/IP 问题的内容,但我们还没有真正涵盖内核中的“网络代码”访问硬件时会发生什么。为了准确地描述这一点,我们必须稍微谈谈接口和驱动程序的概念。
首先,当然是硬件本身,例如以太网、FDDI 或令牌环网卡:这是一片环氧树脂板,上面布满了许多带有奇怪数字的小芯片,安装在您的 PC 的插槽中。这就是我们通常所说的物理设备。
为了让您使用网卡,您的 Linux 内核中必须存在特殊的函数,这些函数了解访问此设备的特定方式。实现这些功能的软件称为设备驱动程序。Linux 具有适用于许多不同类型网络接口卡的设备驱动程序:ISA、PCI、MCA、EISA、并行端口、PCMCIA,以及最近的 USB。
但是,当我们说驱动程序“处理”设备时,我们是什么意思呢?让我们考虑一下以太网卡。驱动程序必须能够以某种方式与外围设备的板载逻辑通信:它必须向网卡发送命令和数据,而网卡应将接收到的任何数据传递给驱动程序。
在 IBM 风格的个人计算机中,这种通信通过映射到网卡上寄存器的一组 I/O 地址和/或通过共享或直接内存传输进行。内核发送到网卡的所有命令和数据都必须发送到这些地址。I/O 和内存地址通常通过提供起始或基地址来描述。ISA 总线以太网卡的典型基地址是0x280或0x300。PCI 总线网卡通常会自动分配其 I/O 地址。
通常您不必担心任何硬件问题,例如基地址,因为内核会在启动时尝试检测网卡的位置。这称为自动探测,这意味着内核读取几个内存或 I/O 位置,并将在那里读取的数据与如果某个网卡安装在该位置时期望看到的数据进行比较。但是,可能存在内核无法自动检测到的网卡;对于某些廉价网卡来说,情况有时就是这样,这些网卡不是其他制造商标准网卡的完全克隆。此外,内核通常会在启动时尝试仅检测一个网络设备。如果您使用多个网卡,则必须显式地告诉内核其他网卡。
您可能需要告诉内核的另一个参数是中断请求线。硬件组件通常会在需要处理时中断内核——例如,当数据到达或发生特殊情况时。在 ISA 总线 PC 中,中断可能发生在 15 个中断通道之一上,编号为 0、1 以及 3 到 15。分配给硬件组件的中断号称为其中断请求号 (IRQ)。[1]
如第 2 章中所述,内核通过称为接口的软件构造访问网络硬件。接口提供了一组抽象函数,这些函数在所有类型的硬件中都是相同的,例如发送或接收数据报。
接口通过名称标识。在许多其他类 Unix 操作系统中,网络接口实现为/dev/目录中的特殊设备文件。如果您键入ls -las /dev/命令,您将看到这些设备文件的外观。在文件权限(第二)列中,您将看到设备文件以字母开头,而不是普通文件看到的连字符。此字符指示设备类型。最常见的设备类型是b,表示设备是块设备,每次读取和写入都处理整个数据块,以及c,表示设备是字符设备,每次处理一个字符的数据。在您通常在 ls 输出中看到文件长度的位置,您会看到两个数字,称为主设备号和次设备号。这些数字指示设备文件关联的实际设备。
每个设备驱动程序都在内核中注册一个唯一的主设备号。该设备的每个实例都为该主设备注册一个唯一的次设备号。tty接口,/dev/tty*,是字符模式设备,由 “c” 指示,并且每个设备的主设备号为4,但/dev/tty1的次设备号为1,而/dev/tty2的次设备号为2。设备文件对于许多类型的设备非常有用,但在尝试查找要打开的未使用设备时,使用起来可能很笨拙。
Linux 接口名称在内核中内部定义,而不是/dev目录中的设备文件。一些典型的设备名称稍后在第 3.2 节中列出。” 接口到设备的分配通常取决于配置设备的顺序。例如,安装的第一个以太网卡将变为eth0,下一个将是eth1。SLIP 接口的处理方式与其他接口不同,因为它们是动态分配的。每当建立 SLIP 连接时,都会为串行端口分配一个接口。
图 3-1 说明了硬件、设备驱动程序和接口之间的关系。
启动时,内核会显示它检测到的设备以及它安装的接口。以下是典型启动消息的摘录
. . This processor honors the WP bit even when in supervisor mode./ Good. Swansea University Computer Society NET3.035 for Linux 2.0 NET3: Unix domain sockets 0.13 for Linux NET3.035. Swansea University Computer Society TCP/IP for NET3.034 IP Protocols: IGMP,ICMP, UDP, TCP Swansea University Computer Society IPX 0.34 for NET3.035 IPX Portions Copyright (c) 1995 Caldera, Inc. Serial driver version 4.13 with no serial options enabled tty00 at 0x03f8 (irq = 4) is a 16550A tty01 at 0x02f8 (irq = 3) is a 16550A CSLIP: code copyright 1989 Regents of the University of California PPP: Version 2.2.0 (dynamic channel allocation) PPP Dynamic channel allocation code copyright 1995 Caldera, Inc. PPP line discipline registered. eth0: 3c509 at 0x300 tag 1, 10baseT port, address 00 a0 24 0e e4 e0,/ IRQ 10. 3c509.c:1.12 6/4/97 becker@cesdis.gsfc.nasa.gov Linux Version 2.0.32 (root@perf) (gcc Version 2.7.2.1) #1 Tue Oct 21 15:30:44 EST 1997 . . |
此示例表明内核已编译并启用了 TCP/IP,并且它包含 SLIP、CSLIP 和 PPP 的驱动程序。倒数第三行表示检测到 3C509 以太网卡并将其安装为接口eth0。如果您有其他类型的网卡——例如 D-Link 袖珍适配器——内核通常会打印一行以其设备名称开头的行——dl0在 D-Link 示例中——后跟检测到的网卡类型。如果您安装了网卡但没有看到任何类似的消息,则内核无法正确检测您的网卡。这种情况将在后面的“以太网自动探测”部分中讨论。
[1] | IRQ 2 和 9 是相同的,因为 IBM PC 设计有两个级联中断处理器,每个处理器有 8 个 IRQ;辅助处理器连接到主处理器的 IRQ 2。 |