实验提示
总体提示
- 在内核里修改的文件会被记录到文件系统镜像中,如果你想复原最初的
testcases/sdcard/的内容,可以在make run前执行./build_img.sh sdcard。 - 你可以使用
axlog提供的error!warn!info!等输出,如果希望修改输出的等级,可以看看根目录下Makefile中的LOG常量。 Starry的代码量很大,如果不知道从哪里下手,先试试本章教学的strace方法,只看可能出问题的syscall和它们调用的函数。- 你可以把
SDCARD_TESTCASES常量改为busybox sh,然后亲自进入终端调试。 Starry的设计文档可能会对你了解这个内核有一些帮助
实验比指导书中介绍的与 busybox ls 相关的调试要简单,看 strace 找原因也比较直接,最靠近报错输出的那一两个就是答案,不会要求大家分析大量 syscall。
流程提示
首先,记得按实验要求修改 SDCARD_TESTCASES常量。
使用定位
ls命令存在的问题一节中提到的syscall输出,直接make run运行,mv会给出如下报错信息mv: can't stat 'bin/abc': No error information看看在这条信息的前面有哪些
syscall。然后在你的本机随便找个地方运行strace测试类似的命令:mkdir bin touch abc strace busybox mv abc bin/对比一下,哪个
syscall的返回值可能有问题?你只需要修改一行代码,也可以顺手把附近有相同错误的另一行也改了。此时 mv 会报错:
mv: can't rename 'abc': Operation not permitted这是因为位于
ulib/axstarry/syscall_fs/src/imp/ctl.rs的syscall_renameat2其实只是个空壳,还没有实现。你需要参考syscall说明 完成它。在我们给出的
ctl.rs中已经包含了一些额外的提示信息。在做到第二个编程任务时,可以再次用
strace,尝试理解它的syscall输出:Linux 下的
busybox是怎么区分bin和bin/的,它怎么知道我们想要把def放到bin/def目录下,而不是重命名成一个叫bin的文件?而内核做错了哪里?只需要改一个文件的一处代码,需要 5 行左右的修改。