xv6에 새로운 System Call과 User Program 추가하기

­3zu·2022년 3월 12일
0

운영체제

목록 보기
3/20
post-thumbnail

System Call

system call은 user program이 system resource를 원하는 등의 상황에서 OS의 도움을 필요로 할 때 사용하는 인터페이스이다.

user mode에서 프로그램이 실행되다가 system call을 호출하면 kernel mode에서 작업을 수행한 뒤 다시 user mode로 return된다.

System Call 추가하기 (1) 새로운 파일을 만드는 경우

xv6 디렉토리에 prac_syscall.c를 추가해서 새로운 system call을 만들어보자.

  1. 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;
}
  1. Makefile : prac_syscall.o를 추가한다.
$ vi Makefile
OBJS = \
...
	vm.o\
    prac_syscall.o\
  1. defs.h : my_syscall()을 추가한다. 다른 파일들에게 새로운 syscall이 보이도록 설정해주는 것이다.
$ vi defs.h
...
void clearpteu(pde_t *pgdir, char* uva);

//prac_syscall.c
int my_syscall(char*);
  1. 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);
}
  1. syscall.h : SYS_my_syscall()을 등록한다.
$ vi syscall.h
...
#define SYS_close 21
#define SYS_my_syscall 22
  1. 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,
  1. user.h : my_syscall()을 등록한다. user 프로그램에게 syscall을 보이게 해준다. user 프로그램에게 보이는 모든 syscall은 user.h에 기록되어 있다.
$ vi user.h
...
int uptime(void);
int my_syscall(char*);
  1. usys.S : macro를 등록한다.
$ vi usys.S
...
SYSCALL(uptime)
SYSCALL(my_syscall)

System Call 추가하기 (2) 기존의 파일을 사용하는 경우

  1. sysproc.c : 새로운 system call인 sys_getppid를 추가한다.
$ vi sysproc.c
...
int
sys_getppid(void)
{
	return myproc()->parent->pid;
}
  1. syscall.h : SYS_getppid 등록
$ vi syscall.h
...
#define SYS_getppid 23
  1. syscall.c : sys_getppid 등록
$ vi syscall.c
...
extern int sys_getppid(void);
...
[SYS_getppid] sys_getppid,
  1. user.h : getppid 등록
$ user.h
...
int getppid(void);
  1. usys.S : getppid등록
$ vi usys.S
...
SYSCALL(getppid)

System Call을 사용하는 User Program 추가하기

  1. 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();
}
  1. Makefile : test.c추가하기
$ vi Makefile
...
UPROG=\
...
	_test\
...
EXTRA=\
	umalloc.c test.c\

0개의 댓글