MIT 6.s081 Lab2 System Call
xv6系统用户态调用syscall过程分析
- /user/usys.S 是用户态进入内核态的汇编脚本,该文件由usys.pl生成
1 | .global sysinfo |
- /kernal/syscall.c,该函数获取用户态传递的syscall id,并进行调用
1 | void syscall(void) { |
- /kernal/sysproc.c,该文件是lab2中syscall的实现代码文件
1 | //实现syscall,该函数需在syscall.c中声明 |
添加syscall流程
在syscall.h中添加一个syscall id
1
2#define SYS_trace 22
#define SYS_sysinfo 23在syscall.c中添加syscall的函数定义
1
2extern uint64 sys_trace(void);
extern uint64 sys_sysinfo(void);1
2[SYS_trace] sys_trace,
[SYS_sysinfo] sys_sysinfo在sysproc中实现syscall函数
1
2
3
4
5
6
7
8uint64 sys_trace(void){
int muskid;
// 获取system call 参数
argint(0,&muskid);
return trace(muskid);
}在/user/usys.pl加入系统调用声明
1
2entry("trace");
entry("sysinfo");
这样以来,用户态向内核态传递syscall id(a7),内核态根据id对相应的syscall进行调用,并将返回值储存在a0寄存器。