B. 确定插入网卡的 EPROM 的大小和速度

本节内容来自 etherboot 项目的 5.0 版本文档。它提供了确定与特定网卡配合使用的 EPROM 的大小和速度的技巧

网络卡接受的最小 EPROM 是 8kB 的 EPROM (2764)。16kB (27128) 或 32kB (27256) 是标准配置。有些卡甚至可以使用高达 64kB 的 EPROM (27512)。(您经常会在 27 后面看到一个 C,例如 27C256。这表示 CMOS EPROM,它与非 C 版本等效,并且由于功耗较低而是一件好事。)您应该尽可能使用最小的 EPROM,这样您就不会占用超出需要的更多上层内存区域,因为其他扩展 BIOS 可能需要空间。但是,您也希望获得划算的 EPROM 价格。目前,32kB 和 64kB 的 EPROM(27256 和 27512)看起来每单位最便宜。较小的 EPROM 似乎更贵,因为它们已退出主流生产。

如果您无法从文档中找到您的网卡所需的 EPROM 容量,对于 ISA 网卡,您可以通过试错法来确定。(PCI 网卡在 BIOS 告知网卡之前不会启用 EPROM。)取一块带有某些数据的 ROM(比如字符生成器 ROM)并将其插入插槽。小心不要在此测试中使用扩展 BIOS,因为它可能会被检测到并激活,并阻止您启动计算机。使用 DOS 下的 debug 程序,转储内存空间的各个区域。假设您发现可以在从 CC00:0 到 CC00:3FFF (= 4000 十六进制 = 16384 十进制位置) 的内存窗口中看到数据。这表明需要 16kB 的 EPROM。但是,如果您在内存空间的某些部分看到别名,例如从 CC00:0 到 CC00:1FFF 的区域在 CC00:2000 到 CC00:3FFF 中重复,那么您已经将 8kB 的 EPROM 放入了 16kB 的插槽中,您需要尝试更大的 EPROM。

请注意,由于 28 针 EPROM 的引脚排列在某种程度上是向上兼容的,因此您可能可以在为较小容量设计的插槽中使用更大容量的 EPROM。较高的地址线可能会保持高电平,因此您需要将映像编程到较大 EPROM 的上半部分或四分之一部分,具体情况而定。但是,您应该在使用数据手册和万用表的情况下仔细检查引脚上的电压,因为 CMOS EPROM 不喜欢浮动引脚。

如果 ROM 大于映像的大小,例如,包含 16kB 映像的 32kB ROM,那么您可以将映像放在 ROM 的任意一半中。您有时会看到建议在 ROM 中放置两个映像副本。这会起作用,但不建议这样做,因为如果它是传统 ROM,则 ROM 将被激活两次,如果它是 PCI/PnP ROM,则可能根本无法工作。Etherboot 可以容忍这种情况,因为代码会检查它是否已被激活,第二次激活将不执行任何操作。推荐的方法是用空白数据填充未使用的半部分。建议使用全一数据,因为它是 EPROM 的自然状态,并且 PROM 编程器的工作量较少。这是一个 Unix 命令行,它将生成 16384 字节的 0xFF,并将其与 16kB ROM 组合成 32kB 映像,供您的 PROM 编程器使用。
      # (perl -e 'print "\xFF" x 16384'; cat bin32/3c509.lzrom) > 32kbimage
    

所需的 EPROM 速度取决于它如何连接到计算机总线。如果 EPROM 直接连接到计算机总线,就像许多廉价的 NE2000 克隆卡一样,那么您可能需要获得至少与主 BIOS 使用的 ROM 一样快的 EPROM。这通常是 120-150 纳秒。有些网卡通过电路来调节对 EPROM 的访问,这可能会插入等待状态,以便可以使用较慢的 EPROM。顺便说一句,EPROM 的速度慢并不会对 Etherboot 的执行速度产生太大影响,因为 Etherboot 在执行之前会将其自身复制到 RAM 中。我听说 Netboot 也做同样的事情。

如果您有自己的 EPROM 编程硬件,那么在 http://www.canb.auug.org.au/~millerp/srecord.html 上有一个很好的 EPROM 文件格式转换实用程序集合。Etherboot 构建过程生成的文件是纯二进制文件。一个简单的二进制到 Intel hex 格式转换器可以在 Etherboot 网站 http://etherboot.sourceforge.net/bin2intelhex.c 上找到。您也可以使用 binutils 包中包含的 objcopy 实用程序
      # objcopy --input-target binary --output-target ihex binary.file intelhex.file
      # objcopy --input-target ihex --output-target binary intelhex.file binary.file
    

据信 Etherboot 为 PCI 网卡制作 PnP 兼容 ROM。标头中一个长期存在的错误已被追踪到。但是,市面上存在一些有缺陷的旧 BIOS,所以我编写了一个 Perl 脚本 swapdevids.pl,以便在必要时切换标头。您必须以两种方式进行实验才能找出哪种方式有效。或者,您可以使用 Perl 脚本 disrom.pl 转储一个有效的 ROM 映像(例如 RPL、PXE ROM)。要查看的字段是设备(基址、子类、接口)类型。它应该是 02 00 00,但由于原始规范中的歧义,有些 BIOS 需要 00 00 02。