跳转到内容

练习

首先克隆实验代码:

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, INFOWARN 这几个层级.

评测机会对 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 分屏,而 gdbclientgdbserver 需要开启两个终端才能实现.