常问问题¶
实验一¶
Q1: 为什么我提交的内核用 ls -l
看大小小得不正常?为什么我无法运行我提交的内核?……
A1: 在提交 bzImage
的时候需要注意:不要提交软链接。arch/x86_64/boot/bzImage
是一个指向 arch/x86/boot/bzImage
的软链接,如果提交的是软链接,我们会无法找到你实际编译的内核文件。
Q2: 下载内核源代码怎么这么慢?
A2: 如果你遇到了网络问题,可以从科大镜像站或者清华 TUNA 镜像站下载。
Q3: 为什么只放 1
和 init
两个文件,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 却返回)。