LAB 6总结与讨论

33 views
Skip to first unread message

Lin Yuning

unread,
Feb 6, 2011, 3:30:25 AM2/6/11
to xv6-jos
git地址:https://github.com/l2y3n2/my-jos

节前就上传好了,赶着回老家么时间发总结,老样子只做了基本Exercise。

LAB6 要求实现网卡驱动及对应的系统调用。用的是qemu自带的虚拟网卡,方便调试。

这个网卡能够通过内存中预先设置好的链表结构(缓存区、具体在Manual里面有)自动发送/接受多个packet,我实现上也是按照最简单的来,没有用硬件中断、收包采取的是不断轮询的方法。
发包时缓存满了/收包是缓存区为空等情况,在内核驱动中我也是直接返回错误,具体的等待/重发由用户空间实现。

网络部分实现是通过三个用户进程(env[2]、output、input)相互协作来实现的,具体看网页。

Q1:传送缓存采用最简单的形式:
+---------------------------------------------------------------------------------------------------------------+
|                                                                                                               |
+->+--------------+--------------+  +--->+--------------+--------------+  +--->+--------------+--------------+  |
   |    CONTROL   |    STATUS    |  |    |    CONTROL   |    STATUS    |  |    |    CONTROL   |    STATUS    |  |
   +--------------+--------------+  |    +--------------+--------------+  |    +--------------+--------------+  |
   |            LINK      -------|--+    |            LINK      -------|--+    |            LINK      -------|--+
   +--------------+--------------+       +--------------+--------------+       +--------------+--------------+
   |         0xFFFFFFFF          |       |         0xFFFFFFFF          |       |         0xFFFFFFFF          |
   +--------------+--------------+       +--------------+--------------+       +--------------+--------------+
   |    0    |0xE0|     SIZE     |       |     0   |0xE0|     SIZE     |       |     0   |0xE0|    SIZE      |
 / +--------------+--------------+       +--------------+--------------+       +--------------+--------------+
S  |                             |       |                             |       |                             |
I  |           PACKET            |       |            PACKET           |       |            PACKET           |
Z  |            DATA             |       |             DATA            |       |             DATA            |
E  |                             |       |                             |       |                             |
 \ +--------------+--------------+       +--------------+--------------+       +--------------+--------------+
就是网页上面的那种。如果缓存已满,内核(e100.c)直接返回错误,用户(output.c)先sys_yield让出CPU,等下次调度到的时候重新尝试。

Q2:接受缓存同样采用Simple模式
+---------------------------------------------------------------------------------------------------------------+
|                                                                                                               |
+->+--------------+--------------+  +--->+--------------+--------------+  +--->+--------------+--------------+  |
   |    CONTROL   |    STATUS    |  |    |    CONTROL   |    STATUS    |  |    |    CONTROL   |    STATUS    |  |
   +--------------+--------------+  |    +--------------+--------------+  |    +--------------+--------------+  |
   |            LINK      -------|--+    |            LINK      -------|--+    |            LINK      -------|--+
   +--------------+--------------+       +--------------+--------------+       +--------------+--------------+
   |          RESERVED           |       |          RESERVED           |       |          RESERVED           |
+--------------+--------------+ +--------------+--------------+ +--------------+--------------+ | 1518 | COUNT | | 1518 | COUNT | | 1518 | COUNT |
/ +--------------+--------------+ +--------------+--------------+ +--------------+--------------+ 1 | | | | | | 5 | PACKET | | PACKET | | PACKET | 1 | DATA | | DATA | | DATA | 8 | | | | | | \ +--------------+--------------+ +--------------+--------------+ +--------------+--------------+
如果缓存为空,内核(e100.c)直接返回无数据(0),用户(input.c)先sys_yield让出CPU,等下次调度到的时候重新尝试
完成input部分之后的make grade测试脚本采用的是发送100个UDP包,然后看程序是否能完整接收到。因为我这里采用的是软件轮询、中间还有主动让出CPU,
而UDP包本身又是不保证接受到的,所以很容易中间漏接受几个包,就会导致make grade失败。为了能够保证测试通过,可以将接受缓存的数量弄多一些(我
设置成了32块),也不要设置太大,不然就测不到缓存满的情况了。
而且原始代码中由于input和env[2]直接通过nsipcbuf这块buffer进行通讯,可能在env[2]还没有处理完数据又调度到input、input进程读取下一块缓存、覆盖了
nsipcbuf的内容导致丢包、所以最好还是自己弄几个buffer交替使用,保证env[2]来得及进行处理(我设置了2块,偶尔make grade脚本还是会出错,多试几次就好了……)
如果make grade的input[100]出错了,可以在测试input[100]还没结束的时候直接CTRL+C中断,然后看jos.out的内容,应该有100块,每块最后的数据是001、002、
……、099、100的16进制代码,看下如果出现重复就是input里面的nsipcbuf处理来不及就直接被新的内容覆盖掉了。如果有漏数据就是接受的缓存块数太少所以有些
Q3:当时忘记看了……现在手头没环境看不了。不过相比之前的内容、最后一个Exercise就很简单了,没什么好说的。
Q4:也没什么好说的

最后虽然有点迟了,还是祝大家新年快乐~~

Yan Hong

unread,
Feb 9, 2011, 8:31:47 AM2/9/11
to xv6...@googlegroups.com
唉,前期用力过猛,现在彻底萎了,Lab 6放着两个多月都没做。。。。。

2011/2/6 Lin Yuning <l2y...@gmail.com>
Reply all
Reply to author
Forward
0 new messages