Lab链接:Lab: networking
Lab源码:momo/MIT-6S081/net - Gitee.com
题目
你要用一款叫 E1000 的网卡来处理网络通信。在 xv6 看来,这个 E1000 就像一块真实连接到局域网的硬件。但实际上它是 QEMU 模拟出来的,它连接的网络也是 QEMU 虚拟的,在这个虚拟网络中:
- xv6 系统(作为“客户机”)的 IP 地址是 10.0.2.15
- 运行 QEMU 的电脑(作为“主机”)则看起来像是网络中另一个地址为 10.0.2.2 的设备
当 xv6 通过 E1000 发送数据包给 10.0.2.2 时,QEMU 就会把这个数据包转交给你主机上正在运行的应用程序
具体而言,你要实现该网卡驱动传输网络包e1000_transmit()
和接受网络包e1000_recv()
两个处理程序
思路
传输数据包e1000_transmit()
- 在内存开辟一个暂存待发送数据包的缓冲区,
struct tx_desc
中的addr字段指向内核将待发送数据包写入缓冲区的地址 - 维护一个
struct tx_desc
的环状数组
接受网络包e1000_recv()
- 在内存开辟一个暂存接收到的数据包的缓冲区,
struct rx_desc
中的addr字段指向E1000将接受到的数据包写入缓冲区的地址 - 维护一个
struct rx_desc
的环状数组