分类: LINUX
2012-12-09 22:54:31
迄今为止,关于网络接口和常见的 T C P / I P 问 题 , 我 们 已 谈 了 不 少 , 但 尚 未 真 正 接 触 到 内 核中的“联网程序”访问硬件时所发生的事。鉴于此,还必须为大家讲讲接口和驱动程序这 两个概念。
首当其冲的是硬件本身。比如以太网卡:它是一片环氧基树脂卡,上面布满了微晶片, 这些微晶片上还有些编号,这块卡插在计算机内的一个插槽内。我们通常称之为设备
( d e v i c e )。 如果希望能够使用以太网卡,你必须在自己的内核中准备一些特殊的功能,使之能识别
这种设备特有的访问方式。这就是所谓的设备驱动程序。例如, L i n u x 中 就 有 几 个 以 太 网 卡 驱 动程序,这几个程序的功能都差不多。其中,最有名的是 B e c k e r串 行 驱 动 程 序 ( 得 名 于 其 作 者 D o n a l d B e c k e r )。另一个是 D - L i n k 驱动程序,该程序对附着在一个并行端口上的 D - L i n k封装 适配器进行控制。
在提到驱动程序“控制”设备时,其含义究竟是什么?首先回头看看上面提到的以太网 卡。驱动程序必须能够与卡上的外设进行通信:它必须向卡发送命令和数据,而卡也应该将 驱动程序发来的所有数据统统投递出去。
P C 中,这种通信常常发生在一个 I / O 内 存 区 内 , 该 内 存 区 对 应 板 载 寄 存 器 。 内 核 发 送 给 卡 的所有命令和数据都必须通过这些寄存器。 I / O 内 存 区 一 般 被 描 述 为 起 点 或 基 础 地 址 。 以 太 网 卡的典型基础地址是 0 x 3 0 0 或 0 x 3 6 0 。
通常情况下,不要去在意基础地址之类的硬件问题,因为内核会在启动时,对设备位置 进 行 侦 测 。 这 就 是 所 谓 的 “ a u t o p r o b i n g ”( 自 动 侦 测 ), 意 思 是 如 果 已 安 装 特 定 的 以 太 网 卡 , 内核就会对若干个内存位置进行读取,并把它所读取的数据和它看到的数据进行比较。但是, 也有内核不能自动侦测的以太网卡;比如,一些便宜仿造标准网卡的以太网卡。另外,内核 在启动时,只能试着侦测一个以太网设备的位置。如果你使用的以太网卡不止一个,就必须 清楚地将这些网卡的情况告诉内核。
另一个必须告诉内核的参数是中断请求通道( interrupt request channel)。有的硬件组件在 特 别 需 要 重 视 时 , 通 常 可 能 中 断 内 核 。 比 如 , 数 据 抵 达 或 出 现 特 殊 的 情 况 。 在 P C 中, 1 5 个中 断 通 道 ( 编 号 0 、1 、 3 一直到 1 5 ) 中 , 其 中 之 一 可 能 会 发 生 中 断 。 分 配 给 硬 件 组 件 的 中 断 编 号 叫作“中断请求编号”或 I R Q( I R Q 2 和 9 是一样的,因为 P C 有 两 个 层 叠 式 中 断 处 理 器 , 每 个 处理器都有 8 个 I R Q ;辅助处理器连接的是主处理器的 IRQ 2 )。
正如我们在第 1章中所讲的那样,内核通过一个所谓的接口访问设备。接口提供了适用于 所有硬件的一个抽象功能集,比如收发数据报。
接口的识别是通过接口名进行的。接口名是在内核内部定义的,而不是 / d e v 目 录 下 的 设 备 文件。常见的接口名用于以太网接口的 e t h 0 、 e t h 1 等 等 。 为 设 备 分 配 接 口 常 常 和 设 备 的 配 置 顺 序有关;比如,第一块以太网卡是 e t h 0 ,下一个将是 e t h 1 ,以此类推。唯一例外的是 S L I P 接口, 它是动态分配的;也就是说,只要一建立 S L I P 链 接 , 就 会 为 串 行 端 口 分 配 一 个 接 口 。 内 核 将在启动时,显示它所侦测的设备和它所安装的接口。
3.1 内核配置
在运行一个系统时,应该对内核的构建非常熟练。这方面的基础知识可参见马特·维尔 希 所 著 的 《 安 装 和 入 门 指 南 》( 这 本 指 南 也 包 括 在 C o r i o l i s G r o u p 的《 L i n u x 系 统 编 程 白 皮 书 》 内)。本小节,我们只为大家讨论一些连网所涉及的配置选项。
在运行make config时,首先会要求你回答几个常见的配置问题,比如,是否希望内核数 学 模 拟 等 等 。 其 中 之 一 是 问 你 是 否 需 要 T C P / I P 支 持 。 必 须 回 答 “ Y ”(是), 才 能 获 得 内 核 连 网能力。
3.1.1 内核选项1.0及以上版本
注意 本小节无示例。要查找更新内容,请参考在线版。
结束常见配置询问之后,配置会继续问一些不同特性方面的问题,比如 S C S I 驱 动 程 序 等 。 接下来的问题仍然和连网支持有关。由于 L i n u x 的 开 放 性 , 要 想 完 整 地 罗 列 出 所 有 的 配 置 选 项 几乎是不可能的。不过, 1 . 0 到 1 . 1 之 间 的 大 多 数 内 核 选 项 版 本 都 提 供 了 一 份 常 见 选 项 清 单 ( 加 引号部分是批注):
如 果 你 想 使 用 “ 任 何 ” 类 型 的 连 网 设 备 ( 不 管 它 是 以 太 网 , 是 S L I P 还是 P P P ) 时 , 不 管 扩 弧内显示什么样的宏名,都必须回答“ Y”(是)。如果回答“Y”(是),就可以自动启用对以 太网设备的支持。对其他类型网络驱动程序的支持则必须单独启用。
这些问题和 L i n u x支持的不同链路层协议有关。 S L I P 允许你通过串行线路传输 I P 数据报。 压缩报头( c o m p r e s s e d h e a d e r )选项提供了对 C S L I P 的支持,这种压缩技术将 T C P / I P 报头压缩 为三个字节。注意,这个内核选项没有自动打开 C S L I P ;它只是为 C S L I P 提 供 了 必 要 的 内 核 功 能。
P P P 是通过串行线路发送网络通信的另一种协议。它比 S L I P 更为灵活,对 I P 也 没 有 什 么 限 制,同时还支持 I P X 。 P L I P为通过并行连接发送 I P 数 据 报 提 供 了 一 种 解 决 办 法 。 主 要 用 于 与 运 行 D O S 的计算机进行通信。
接下来的问题则和不同厂家的以太网卡有关。由于新的驱动程序层出不穷,这方面的问 题肯定也是有增无减。如果想建立一个适用于不同类型机器的内核,可以采用多个驱动程序。
3.1.2 内核选项1.1.14及以上版本 注意 本小节无示例。
从 1 . 1 . 1 4 开 始 , 由 于 增 加 了 对 I P X 的 A l p h a 支 持 ( 处 于 测 试 阶 段 ), 配 置 过 程 有 了 少 许 变 化 。 常见选项这部分将问你是否需要常规连网支持。随后,是涉及到各种连网选项的两个问题。
要想采用 T C P / I P 连 网 , 必 须 回 答 “ Y ”(是)。但回答“ N ”( 否 ) 的 话 , 也 能 编 译 具 有 I P X 支持的内核。
尽管通过默认设置启用它没什么坏处,但你肯定想取消这一选项,把一台主机配置为一个所 谓的防火墙。防火墙即是连接两个或两个以上网络,但不会在这些网络间路由通信的主机。 它们常用于对来自网络的用户提供因特网访问,保护公司内部网络不受来自因特网的攻 击和破坏。用户将得到许可登录到防火墙,使用因特网服务,但公司的机器不会因此而受到 外界的攻击和破坏。因为任何接入的连接是不能通过防火墙的。
这个选项和 P C / T C P 的某些版本不兼容,后者是针对基于 D O S 的计算机的一种商业 T C P / I P 实施方案。如果启用了这个选项,虽然仍然可以和普通计算机进行通信,但性能肯定会大受 影响。
这 个 选 项 的 作 用 是 启 用 了 R A R P ( 逆 向 地 址 解 析 )。 无 盘 客 户 机 和 X 终 端 在 启 动 时 , 利 用 R A R P 来查询自己的 I P 地址。只有计划充当这类客户机时,才有启用 R A R P 的 必 要 。 网 络 公 用 程序的最新封装( n e t - 0 . 3 2 d )中,包含了一个小型的公用程序,其名为 r a r p ,它允许在 R A R P 缓存内增添系统。
在通过 T C P 链 路 发 送 数 据 时 , 内 核 必 须 在 把 数 据 交 给 I P 协 议 之 前 , 将 它 分 为 若 干 个 包 。 对 通过本地网络(比如以太网)就能抵达的主机来说,可采用较大的数据包(相对于必须通过 长距离链路才能抵达的主机而言)。这样可避免小型数据包通过链路之后产生的碎片。如果不 启用 S N A R L ,内核将事实上只有一个接口的网络假定为本地网络。看看 G r o u c h o M a r x 大学的 网络 B ,整个网络都是本地的,但多数主机只连接了一个或两个子网。如果启用 S N A R L ,内 核就会假定“所有”的子网都是本地的,在与校园内的其他所有主机通信时,都会发送大型 数据包。
如果想对发往某些特殊主机(比如这种情况:数据将通过 S L I P 链 路 ) 的 数 据 采 用 小 型 数 据包的格式,利用路由的 m t u 选项即可。关于 m t u ( 最 大 传 输 单 元 ) 的 详 情 , 参 见 上 一 章 。
对避免发送特别小的 I P 包(也称作 t i n y g r a m s )来说, N e g l e 算法是颇有启发性的。
t i n y g r a m s (微型豆)通常由一些交互性的联网工具创建,这些工具只传输一个单独的键击, 比如 t e l n e t 和 r s h 。在诸如 S L I P 之类的低带宽链路上,微型豆特别浪费带宽。某些情况下,
N e g l e 算法通过简单限制 T C P 数 据 传 输 的 方 式 , 试 着 避 开 这 些 微 型 豆 。 如 果 你 碰 上 包 丢 失 这 一 严重问题时,取消这一算法即可。
从 1 . 1 . 1 6版本的内核开始, L i n u x 对 另 一 种 驱 动 程 序 类 型 提 供 了 支 持 , 它 就 是 伪 驱 动 程 序 (dummy driver)。下面的问题将在设备驱动程序部分的开始处出现。
伪驱动程序的作用不大,但对单机或 S L I P 主 机 来 说 , 它 的 用 处 就 多 了 。 它 基 本 上 是 一 个 经 过 改 头 换 面 的 回 送 接 口 ( l o o p b a c k )。 出 现 这 类 接 口 的 原 因 之 一 是 在 采 用 S L I P , 但 没 有 以 太 网 的 主 机 时 , 人 们 希 望 有 一 个 接 口 能 一 直 保 存 自 己 的 I P 地 址 。 有 关 详 情 , 我 们 将 在 第 5 章讨论。
3.2 网络设备指南
内核针对不同类型的配置提供了大量的硬件设备驱动程序。本小节将简要介绍一些常见 的驱动程序,以及用于这些驱动程序的接口名。
L i n u x 中 , 有 许 多 标 准 接 口 名 ( 见 下 文 )。 大 多 数 驱 动 程 序 支 持 的 接 口 不 止 一 个 , 所 以 这 种情况下,就应该采用接口编号,比如 e t h 0 、 e t h 1 等等。
■ lo 本地回送接口。和两个网络应用程序一起,供测试之用。它的运行类似于一个封闭 式回路,任何写入这个接口的数据报都将立即返回本地主机的网络层。内核中始终都有一个回送接口。
■ ethn n-th以太网接口。这是大多数以太网卡采用的一般性接口名。
■ dln 此类接口对D-Link DE-600包适配器(另一种以太网设备)进行访问。在衍生于并
行端口的 D E - 6 0 0 中 , 它 是 比 较 特 殊 的 一 种 。
■ s l n n - t h S L I P 接口。 S L I P 接口按照分配顺序,依次和串行线路对应起来。比如说,为
S L I P 配置的第一条串行线路就是 s l 0 ,第二条就是 s l 1 ,以此类推。内核能支持的 S L I P 接口多达 四个。
■ p p p n n - t h P P P 接口。和 S L I P 接 口 一 样 , P P P 接 口 在 串 行 线 路 转 换 为 P P P 模 式 之 后 , 立 即就和它对应起来。其时,内核能支持的接口多达四个。
■ p l i p n n - t h P L I P 接口。 P L I P 在并行线路上传递 I P 数据报。最多能支持三个 P L I P 接口。 这些接口是在系统启动时,由 P L I P 驱 动 程 序 分 配 的 , 它 们 和 并 行 端 口 一 一 对 应 。
对于将来可能增加的其他接口,比如 I S D N 和 A X . 2 5 ,还可能引入其他接口名。用于 I P X ( N o v e l l 连网协议)和 A X . 2 5 ( 供 火 腿 无 线 电 爱 好 者 使 用 ) 的 驱 动 程 序 尚 处 于 开 发 阶 段 , 但 开
始进入 A l p h a 测 试 阶 段 了 。 随后的几个小节中,我们将就上面提到的驱动程序展开讨论。
3.3 以太网安装
目前的网络程序对不同类型的以太网卡提供了广泛的支持。大多数驱动程序都是 D o n a l d B e c k e r ( b e c k e r @ c e s d i s . g s f c . n a s a . g o v )编写的,他为基于国家半导体 8 3 9 0 芯 片 的 网 卡 编 写 了 一 系 列 驱 动 程 序 ; 即 颇 有 名 气 的 B e c k e r 驱 动 程 序 系 列 。 另 外 , 还 有 两 个 产 品 是 面 向 D - L i n k 的, 其中的 D - L i n k 包 适 配 器 允 许 通 过 一 个 并 行 端 口 , 访 问 以 太 网 设 备 。 针 对 这 一 用 法 的 驱 动 程 序 是 Bjørn Ekwall ( b j O r n @ b l o x . s e )编写的。 D E P C A 驱动程序则是 David C . D a v i e s ̆ ̆
( d a v i e s @ w a n t o n . l k g . d e c . c o m )编写的。 3.3.1 以太网接缆
如果你是生平第一次安装以太网卡,就有必要先了解一下布线方面的知识。以太网对布 线是相当挑剔的。线缆的两段必须各有一个 5 0 欧 姆 的 电 阻 器 , 而 且 不 能 有 任 何 分 支 ( 比 方 说 , 三 条 线 缆 组 成 一 个 星 型 连 接 )。 如 果 利 用 一 条 带 有 T 型 B N C 连 接 头 的 细 同 轴 线 缆 , 就 应 该 把 这 些连接头直接拧在网卡的连接器上,而不是插入一段线缆。
如果连接的是粗缆,就必须通过一个收发器(有时也称作以太网附单元)附上你的主机。 可直接将收发器插入网卡上的 A U I 端口,但也可采用一条屏蔽双绞线。
3.3.2 已获支持的网卡
3 C o m 的 E t h e r L i n k — 获 得 支 持 的 有 3 c 5 0 3 和 3 c 5 0 3 / 1 6 。 3 c 5 0 7 和 3 c 5 0 9 也 如 此 。 虽 然 L i n u x 也支持 3 c 5 0 1 , 但 其 速 率 太 慢 , 不 建 议 购 买 。
■ N o v e l l 公司的 E a g l e — 获 得 支 持 的 有 N E 1 0 0 0 和 N E 2 0 0 0 及 其 大 量 的 克 隆 产 品 。 N E 1 5 0 0 和 N E 2 1 0 0 已获得支持。
■ W e s t e r n D i g i t a l / S M C — 获得支持的有 W D 8 0 0 3 和 W D 8 0 1 3 ( S M C E l i t e 和 S M C E l i t e P l u s )。另外, L i n u x 还新增了对 S M C E l i t e 1 6 U l t r a 的支持。
■ H e w l e t t P a c k a r d — 获得支持的有 H P 2 7 2 5 2 和H P J 2 7 2 4 7 B 和H P J 2 4 0 5 A 。另外还有 D - L i n k D E - 6 0 0 包适配器 D E - 1 0 0 、 D E - 2 0 0 和 D E - 2 2 0 - T 。除此以外,还有一个用于 D E - 6 5 0 - T (一种 P C M C I A 卡)的补丁工具。
D E C — 获得支持的有 D E 2 0 0 ( 3 2 k / 6 4 k ) D E 2 O 2 、 D E 1 0 0 和 D E P C A r e v E 。
A l l i e d T e l i e s i s — 已获 L i n u x支持的有 A T 1 5 0 0 和 A T 1 7 0 0 。
要在 L i n u x 下 使 用 上 面 列 举 的 网 卡 , 必 须 采 用 以 上 产 品 的 主 要 分 销 商 提 供 的 一 个 预 编 译 内
核。这些产品一般含有内置驱动程序。但是,从长远的角度来看,最好用你自己的内核,编 译真正能满足自己需要的驱动程序。
3.3.3 以太网自动侦测
系统启动时,以太网程序将试着找到网卡的位置,并判断它的类型。自动侦测代码存在 两大局限。其一是,不能对所有的网卡进行准备识别。这不仅表现在一些便宜的仿造品上,
还表现在 W D 8 0 x 3网 卡 上 。 其 二 是 内 核 不 能 同 时 侦 测 多 块 网 卡 。 因 为 它 会 假 定 你 打 算 控 制 网 卡 和接口的分配问题。
如果你正在使用多块网卡,或自动侦测不能侦测你的网卡时,必须显式告诉内核该网卡 的基础地址和设备名。
N e t - 3 中,可通过两个不同的方案来完成上述任务。其一是改变或增加 d r i v e r s / n e t / S p a c e . c 文件的信息,该文件位于包含所有驱动程序信息的内核源代码内。不过,这一方案的前提是 你对连网代码相当熟悉。第二种方案好的多,即在系统启动时,为内核提供驱动程序信息。 如果用 l i l o 来 启 动 系 统 , 通 过 l i l o . c o n f 内的 a p p e n d ( 添 加 ) 选 项 , 指 定 一 些 参 数 之 后 , 便 可 将 这些参数传给内核。要将一个以太网设备的信息通知给内核,传递下面的参数即可:
ether=irq.base addr. p a r a m 1 . p a r a m 2 . n a m e
前四个参数是数字化的,最后一个参数则是设备名。所有数字化的值都是可选的;如果 都被省略或都设为零,内核就会试着通过侦测参数值的方式,找到这个值,或使用默认值。
第一个参数设置的是分配给这个设备的 I R Q 。 默 认 情 况 下 , 内 核 将 试 着 自 动 侦 测 这 个 设 备 的 I R Q通道。 3 c 5 0 3 驱 动 程 序 有 一 个 非 常 特 殊 的 特 点 , 它 从 列 出 的 5 、 9 、 3 、 4 中 选 出 一 个 I R Q , 并把网卡配置成使用这一行参数。
base_addr参数给出了网卡使用的I/O基础地址;零值表示内核将对上面列出的地址进行侦测。
至于其余两个参数,不同的驱动程序采用的方式是不一样的。对共享内存的网卡来说, 比如 W D 8 0 X 3 , 它 们 指 定 了 共 享 内 存 的 起 始 点 和 终 止 点 。 其 他 网 卡 常 用 p a r a m 1 来 设 置 即 将 显 示的调试信息级别。其值如果在 1到7之间,则表示冗余级不断上升,而如果是 8,就会把所有 冗余都关掉; 0 表示默认设置。 3 c 5 0 3 驱动程序利用 p a r a m 2 选 定 内 部 收 发 器 ( 默 认 设 置 ) 或 外 部收发器(如果该值为 1 的话)。前者采用网卡的 B N C 连接器,后者采用它自己的 A U I 端口。