首先克隆实验代码:
git clone https://github.com/USTB-806/ustb-os-kernel.git
git checkout lab2
执行内核的方式是:
cd ustb-os-kernel && cd kernel
make run
于是它就会将 user 下的用户程序装载至你的 OS 内核中了. 同时你可以执行 make run LOG=DEBUG 来查看执行过程中的日志输出. LOG 可以是 TRACE, DEBUG, INFO 和 WARN 这几个层级.
评测机会对 kernel 目录下执行 make run 的结果进行比对.
本章的练习是:成功执行 user/c/apps/read.c 程序,尝试让其输出 Read content: Success!.
你可能注意到了 commit 记录里 user/c/lib/lib.h 的添加:
#define SYSCALL_OPEN 56
#define SYSCALL_CLOSE 57
#define SYSCALL_READ 63
isize open(const char *path, int flags);
isize close(int fd);
isize read(int fd, void *buf, size_t count);
根据你的经验,你可能还需要添加其他内容来定义这些函数.
除此之外,你可以关注 kernel/src/syscall/fs.rs 这个文件,这是文件相关 syscalls 被定义处,尝试修改 syscalls 让 read.c 正常输出.
另外,我们建议通过本地测试后,再提交至云端进行评测,你可以通过 stdout-ch2 看到测评的整个流程. 执行:
cd ustb-os-kernel
git clone https://github.com/USTB-806/ustb-os-checker.git
cd ustb-os-checker
make test CHAPTER=2
其中 CHAPTER=2 意为运行第 2 章的测试.
然后按照 如何评测 的方法提交 .tar.gz 至 CG 平台. 如果你觉得重复输入 tar 指令非常麻烦,你可以考虑将其添加至 Makefile 中,供作读者练习.
使用 GDB 是一种比较高阶的方法,有能力的同学可以自行尝试,以下 makefile 仅供仅参考:
debug: build
@tmux new-session -d \
"qemu-system-riscv64 -machine virt -nographic -kernel $(KERNEL) -smp 1 -bios default -s -S" && \
tmux split-window -h "riscv64-unknown-elf-gdb -ex 'file $(KERNEL)' -ex 'set arch riscv:rv64' -ex 'target remote localhost:1234'" && \
tmux -2 attach-session -d
gdbserver: build
@qemu-system-riscv64 -machine virt -nographic -kernel $(KERNEL) -smp 1 -bios default -s -S
gdbclient:
@riscv64-unknown-elf-gdb -ex 'file $(KERNEL_ELF)' -ex 'set arch riscv:rv64' -ex 'target remote localhost:1234'
debug 使用 tmux 分屏,而 gdbclient 和 gdbserver 需要开启两个终端才能实现.