Lab: System calls
Author: retrhelo
Date: 2020.10.25
转载请注明出处
实验网址点击这里。在开始本实验之前建议阅读book-riscv-rev1.pdf的第2章以及第4.3、4.4节。
1. 实验1 System call tracing
本实验要求我们实现一个新的系统调用trace()用于追踪特定的系统调用。
1.1 如何在riscv-xv6中实现一个新的syscall?
为了实现一个新的syscall并使得用户代码能够调用它,我们需要分别修改user/以及kernel/两个目录下的文件。
首先,我们需要为用户代码提供一个函数原型(Function Prototype),其通常声明在user/user.h中。在本实验中我们将其声明为int trace(int)。然后,我们需要修改user/usys.pl中的代码。这是为了让Makefile能够通过pl脚本生成trace所对应的stub(MIT的文档中使用了这样的一个术语)。通过这两步,我们便可以通过用户代码实现对trace()函数的调用了。
尽管如此,仅通过上面两步是无法使我们的代码顺利运行的。因为我们仍未在内核代码中定义trace()的行为。为此,我们需要首先在kernel/syscall.h中通过宏为trace系统调用指定一个对应的系统调用号,然后在kernel/syscall.c中定义一个形为int sys_trace(void)的函数,在其中定义trace的相关行为,并将该函数的指针放到syscall对应的向量表(一个函数数组)syscalls(定义在kernel/syscall.c中)。通过这些步骤,我们便成功地向系统中添加了一个新的syscall。
1.2 如何实现trace()的行为
关于trace()的行为