xv6知识
initcode.S调用exec,将exec参数放进寄存器a0a1,系统调用号放入a7
kernel/syscall.c中的Syscalls数组为函数指针表,与系统调用号进行匹配
ecall指令进入内核并执行uservecusertrap,然后执行syscall
syscalla7中获取调用号与Syscalls索引匹配,进入实现函数sys_exec
系统调用实现函数返回时,将返回值放在p->trapframe->a0,一般返回-1为失败

trace的大致流程
首先在shell中输入trace调用trace(),函数内进行解析后,准备前往内核进行内核的调用
经过user/user.h以及汇编指令,进入内核,利用ecall进行系统调用
系统调用号由syscall.h规定,寄存器a7中存放系统调用号,syscall.c中的函数利用系统调用号根据维护的函数指针数组找到系统实现函数的地址,将实现函数调用的返回值放在a0中,系统实现函数保存在sysproc.c
syscall.c中的函数调用proc.c中的myproc()获取在proc.h中定义的proc结构体,结构体保存了进程相关的各种信息

实验1实现思路
proc结构体中增加新参数mask,作用为控制打印,系统调用时,根据系统调用号,系统调用会调用syscall.c中的syscall(),利用新写入的字符串输出代码,进行实验的最后输出,输出参数均可以在函数中获得
修改proc.c中的fork(),在建立子进程时复制mask
sysproc.c添加trace系统调用实现函数,对当前进程proc结构体的mask项进行赋值,mask的来源为调用syscall.c中的函数获得的proc结构体中保存的a0,当正常调用时a0不为0,使得mask也不为0,mask标志位将决定是否打印

syscall.c中的函数
argint()接受一个整数n和一个指针,函数内调用argraw(),功能为将指针指向的值变为进程中第n个状态参数,调用不成功将返回-1,argint()返回0