MIT 6.1810: system calls
MIT 6.1810 中第二个 lab 的 solution
system calls
System call tracing (moderate)
In this assignment you will add a system call tracing feature that may help you when debugging later labs. You’ll create a new trace system call that will control tracing. It should take one argument, an integer “mask”, whose bits specify which system calls to trace. For example, to trace the fork system call, a program calls trace(1 « SYS_fork), where SYS_fork is a syscall number from kernel/syscall.h. You have to modify the xv6 kernel to print out a line when each system call is about to return, if the system call’s number is set in the mask. The line should contain the process id, the name of the system call and the return value; you don’t need to print the system call arguments. The trace system call should enable tracing for the process that calls it and any children that it subsequently forks, but should not affect other processes.
在Makefile中添加$U/_trace\,在user/usys.pl添加entry(“trace”)作为stub,在user/user.h写上系统调用的函数prototypeint trace(int);,在kernrl/syscall.h上添加#define SYS_trace 22这个系统调用的宏定义。
这里可以看出,这里的usys.pl和user.h是用来指明trace这个系统调用,以及它的函数prototype是什么,usys.pl用于生成usys.S这个文件,这个文件包含一切调用系统调用的RISC-V汇编代码。
|
|
并不是系统调用具体的汇编代码实现,那样的文件应该在kernel文件夹内产生。这是一个一个ecall跳转。syscall.h就是一个系统调用的宏定义文件, 这里的SYS_fork就是那个文件里的一个宏,所以要想先编译通过,而不考虑trace的具体实现,这个宏得加上。
在kernel/sysproc.c中添加sys_trace()函数,这里的函数用于把要传递给系统调用的参数进行一步处理。
|
|
本来一开始我是void,return也是直接return没有return 0。但是这样无返回值的话不能过trace all的测试。
在kernel/proc.h文件中在proc结构体中添加一个变量MASK,用来将trace得到的MASK传递给其子进程。
在kernel/proc.c中找到fork系统调用的实现部分,可以看到在前面的代码是用来将父进程的内存复制给子进程,在中间加上一句:
|
|
在kernel/syscall.c文件中添加一个用于存储系统调用名称的字符串数组。
|
|
在同文件的syscall函数中系统调用真正执行的那部分后面添加:
|
|
lab评测:
|
|
Sysinfo (moderate)
In this assignment you will add a system call, sysinfo, that collects information about the running system. The system call takes one argument: a pointer to a struct sysinfo (see kernel/sysinfo.h). The kernel should fill out the fields of this struct: the freemem field should be set to the number of bytes of free memory, and the nproc field should be set to the number of processes whose state is not UNUSED. We provide a test program sysinfotest; you pass this assignment if it prints “sysinfotest: OK”.
在Makefile中添加$U/_sysinfotest,还是按照之前的步骤把syscall编译所需要的那些文件都修改好。不过user/user.h文件需要添加的是:
|
|
kernel/kalloc.c文件新增一个函数:
|
|
这个函数中使用的kmem和run结构体都是什么,可以在同文件的其他函数中大抵发现其含义。比如看看那个kalloc函数
kernel/proc.c文件新增一个函数:
|
|
kernel/defs.h文件需要加上那两个函数的声明。
kernel/sysproc.c文件新增一个函数:
|
|
lab评测:
|
|