system call은 user program이 system resource를 원하는 등의 상황에서 OS의 도움을 필요로 할 때 사용하는 인터페이스이다.
user mode에서 프로그램이 실행되다가 system call을 호출하면 kernel mode에서 작업을 수행한 뒤 다시 user mode로 return된다.
xv6 디렉토리에 prac_syscall.c
를 추가해서 새로운 system call을 만들어보자.
prac_syscall.c
: my_syscall()
을 정의한다.$ vi prac_syscall.c
#include "types.h"
#include "defs.h"
//Simple system call
int
my_syscall(char* str)
{
cprintf("%s\n", str);
return 0xABCDABCD;
}
Makefile
: prac_syscall.o
를 추가한다.$ vi Makefile
OBJS = \
...
vm.o\
prac_syscall.o\
defs.h
: my_syscall()
을 추가한다. 다른 파일들에게 새로운 syscall이 보이도록 설정해주는 것이다.$ vi defs.h
...
void clearpteu(pde_t *pgdir, char* uva);
//prac_syscall.c
int my_syscall(char*);
prac_syscall.c
: wrapper 함수인 sys_my_syscall()
을 작성한다.$ vi prac_syscall.c
...
//Wrapper for my_syscall
int
sys_my_syscall(void)
{
char* str;
//Decode argument using argstr
if(argstr(0, &str) < 0) return -1;
return my_syscall(str);
}
syscall.h
: SYS_my_syscall()
을 등록한다.$ vi syscall.h
...
#define SYS_close 21
#define SYS_my_syscall 22
syscall.c
: SYS_my_syscall()
을 등록한다....
extern int sys_uptime(void);
extern int sys_my_syscall(void);
...
[SYS_close] sys_close,
[SYS_my_syscall] sys_my_syscall,
user.h
: my_syscall()
을 등록한다. user 프로그램에게 syscall을 보이게 해준다. user 프로그램에게 보이는 모든 syscall은 user.h
에 기록되어 있다.$ vi user.h
...
int uptime(void);
int my_syscall(char*);
usys.S
: macro를 등록한다.$ vi usys.S
...
SYSCALL(uptime)
SYSCALL(my_syscall)
sysproc.c
: 새로운 system call인 sys_getppid
를 추가한다.$ vi sysproc.c
...
int
sys_getppid(void)
{
return myproc()->parent->pid;
}
syscall.h
: SYS_getppid
등록$ vi syscall.h
...
#define SYS_getppid 23
syscall.c
: sys_getppid
등록$ vi syscall.c
...
extern int sys_getppid(void);
...
[SYS_getppid] sys_getppid,
user.h
: getppid
등록$ user.h
...
int getppid(void);
usys.S
: getppid
등록$ vi usys.S
...
SYSCALL(getppid)
test.c
: 파일 추가하기$ vi test.c
#include "types.h"
#include "stat.h"
#include "user.h"
int
main(int argc, char* argv[])
{
printf(1, "My ppid is %d\n", getppid());
exit();
}
Makefile
: test.c
추가하기$ vi Makefile
...
UPROG=\
...
_test\
...
EXTRA=\
umalloc.c test.c\