NE2000 与 E1000 网卡——Bochs 的网络接口配置
Bochs 支持的网卡设备
| 网卡 | bochsrc 关键字 | 总线 | 速率 | 适用系统 |
|---|---|---|---|---|
| NE2000 | ne2k: | ISA 或 PCI | 10 Mbps | DOS、Windows 9x、Linux 老内核 |
| Intel 82540EM | e1000: | PCI | 1 Gbps | Windows XP+、Linux |
NE2000 是 PC 史上最经典的网卡——几乎所有操作系统都有它的驱动,配置简单。E1000 是后来的千兆替代。
基本配置
NE2000 网卡
ne2k: enabled=1, mac=00:40:3c:00:00:01, ethmod=slirp
E1000 网卡
e1000: enabled=1, mac=00:40:3c:00:00:02, ethmod=slirp
| 字段 | 说明 |
|---|---|
enabled | 开/关(OS 开发通常关) |
mac | MAC 地址(6 字节十六进制,冒号分隔) |
ethmod | 网络模式(最重要的字段) |
script / option | ethmod 的辅助参数(tap 模式的 tap 设备名等) |
ethmod 网络模式详解
网络模式决定了模拟网卡的数据包到底去了哪里——这是 Bochs 网络配置里最关键的设计选择。
none(默认)
ethmod=none
不连网。客户机看不到任何外部网络。MAC 地址虽然配了但没用。
slirp(推荐,最易用)
ethmod=slirp
用户模式网络——Bochs 内置了一个轻量级的 NAT 路由器,客户机走一个虚拟的 10.0.2.x/24 网段。特点:
- 客户机可以上网(访问外部网站、更新软件)
- 外面不能连进来(宿主机或其他机器不能主动访问客户机)
- 客户机的网关自动指向 Bochs 的虚拟 NAT(10.0.2.2)
- DNS 自动转发到宿主机的 DNS 服务器
经典系统运行上网、OS 开发者在模拟内核里用 curl 下载东西——slirp 是首选。
tap(TAP 设备)
ethmod=tap, script=tap-linux.sh
宿主机上有一个真实的 TAP 虚拟网络设备,客户机网卡直接和它桥接。特点:
- 客户机有独立 IP,可以和宿主机同网段通信
- 可以用 Wireshark 抓到客户机的原始网络流量
- 需要宿主机 root 权限(创建 TAP 设备)
- Linux 最常见;Windows/macOS 支持较繁琐
OS 开发者在调试网络驱动、做真实的 TCP/UDP 实验时用 tap 模式。
raw
ethmod=raw, script=eth0
把 Bochs 网卡直接绑定到宿主机的真实网卡(eth0)。客户机相当于直接插在宿主机所在的网络里。需要 root 权限,风险较高(客户机发的包直接出去了)。
fdb
ethmod=fdb, script=trace.pcap
从 .pcap 文件读取/写入数据包——完全离线,用来复现特定网络场景或回放抓包。
MAC 地址怎么选
Bochs 不强制 MAC 地址格式,但最好遵循:
- 厂商前缀(OUI)随便选一个(如
00:40:3c:是 Novell,NE2000 的老牌 OUI) - 后 3 字节随意
- 同一个宿主机上如果开多个 Bochs 实例,每个用不同 MAC
OS 开发场景要不要开网卡
通常不开。原因:
- 网卡驱动本身是一个独立的复杂模块——对初学内核的人来说,在还没搞清楚内存管理和文件系统之前就加网卡只会增加复杂度
- Bochs 的 NE2000/E1000 实现精度很高,驱动如果写错可能很难排查是驱动 bug 还是 Bochs 模拟 bug
- 如果只是想在模拟内核里用 printf 输出,调试器本身就比网卡好用得多
例外:你的内核实验主题就是"写一个网卡驱动"——那就开。调试器里对 NE2000 的 I/O 端口下断点(如 b 0x300)可以追踪每一次寄存器读写。
经典系统运行的网络
Windows 98 上网:用 NE2000 + slirp,装 NE2000 驱动,IP 设为 DHCP(slirp 有内置 DHCP 服务)。
Windows XP:用 E1000 + slirp,XP 自带 E1000 驱动。
Bochs 调试器里可以用 watch ne2k 或 watch e1000 观察网卡行为(取决于编译时是否启用了对应的调试选项)。