+---------------------------------------------------------------------------------------------------------------+
| |
+->+--------------+--------------+ +--->+--------------+--------------+ +--->+--------------+--------------+ |
| 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:也没什么好说的
最后虽然有点迟了,还是祝大家新年快乐~~