跳转至

常问问题

实验一

Q1: 为什么我提交的内核用 ls -l 看大小小得不正常?为什么我无法运行我提交的内核?……

A1: 在提交 bzImage 的时候需要注意:不要提交软链接arch/x86_64/boot/bzImage 是一个指向 arch/x86/boot/bzImage 的软链接,如果提交的是软链接,我们会无法找到你实际编译的内核文件。

Q2: 下载内核源代码怎么这么慢?

A2: 如果你遇到了网络问题,可以从科大镜像站或者清华 TUNA 镜像站下载。

Q3: 为什么只放 1init 两个文件,init 里写 system("/1"); 会出错?为什么写 execv(),却只运行了第一个程序?

A3: 你需要阅读文档(man system, man execv)来理解库函数做的事情。对于这两个问题,DESCRIPTION 一节都可以看到答案。

Q4: 我可以在运行程序 3 后把屏幕弄花吗?

A4: 可以,只要不 kernel panic。

Q5: 我不想使用 "0x046c" 这种方法计时。我可以使用其他的方式吗?

A5: 可以。

Q6: 实验报告有模板吗?

A6: 报告要点齐全即可,不需要写成长篇大论,行文格式没有强制的要求。

Q7: 我答对了 %d 道思考题,为什么给我扣了 %f 分?

A7: 助教前期只设计了 6 道思考题(6 选 3),因此为思考题分配了 1.5 分的分数。后来增加到了 8 选 4,但是分数分配已确定,所以实际的思考题给分方式为:

  • 答对 0 或 1 道:0 分
  • 答对 1~4 道:0.5 * (答对题数 - 1) 分
  • 答对 4 道或以上:1.5 分

多答的题目答错不扣分,只计答对的数量。

实验二

Q1: 可以使用 Rust 语言吗?

A1: 可以。但是由于三个助教都不会 Rust,因此当你的 shell 因平台或环境原因出现异常时,无法替你 debug(如果有)并给出部分分;如果你使用 C 或者 C++,那么当你的 shell 有 bug 的时候助教可以尝试修复并为酌情给分。

Q2: 可以使用 C++ 标准库(iostream,STL 等)吗?

A2: 可以。

实验三

Q1: 第一部分的任务需要处理 send() 的阻塞情况,但是似乎 1MiB 长度的数据可以一次性 send() 出去?

A1: 在第一、二部分的任务中使用的是阻塞 IO,确实在正常情况下可以一次性发送。但是在非阻塞 IO 中,一次性发送是无法保证的。

Q2: nc 总是输入换行后才发送,要怎么测试?

A2: 可以输入 Ctrl-D 进行 Flush。建议自己用 Python 写一个简单的 TCP 客户端进行测试。

Q3: 为什么消息不会在两个客户端(nc 进程)之间来回传播?

A3: 因为 nc 从 socket 收到数据后把数据打印到标准输出,从标准输入收到数据后把数据通过 socket 发送,而标准输入和标准输出并不是相连的,因此不会来回传播。

Q4: 条件变量必须要和互斥锁一起使用吗?可以去掉例子中的 ready 吗?

A4: 在调用 pthread_cond_signal 前必须对条件变量对应的互斥锁加锁,这和条件变量的实现机制有关。ready 是不可以去掉的,否则可能出现伪唤醒(并没有调用 pthread_cond_signal 但 pthread_cond_wait 却返回)。