lab03. System call and User Program.pdf
computer program이 OS의 커널로부터 어떠한 서비스를 요청하는 것. < ex) 파일을 열때 open 명령 >
user가 system call을 요청하면 kernel 모드로 진입을 해서 커널이 요청한 서비스를 수행하고 유저 프로그램에게 결과를 전달한다. user program은 직접 system call을 호출할 수도 있고 library로도 호출할 수 있다. 커널은 운영체제의 핵심이 되는 프로그램이라서 사용자가 함부로 접근하지 못하도록 유저모드와 커널모드로 관리 통제한다. 그래서 유저가 커널의 시스템 콜을 복사해와서 실행한다 한들 유저 모드라 정상적으로 실행되지 않는다.
다양한 코드들이 있는데 어떻게 유저코드와 커널 코드를 구별할 수 있을까? → Makefile.
user code와 kernel 코드는 동시에 컴파일 하지만 링크를 할 때는 개별적으로 한다.
#include "types.h"
#include "defs.h"
int myfunction(char* str) { .. }
int sys_myfunction(void) { .. }
우선 practice code를 작성할 때 사용했던 헤더파일이다. 아직 정확하게 어떤 기능인진 잘 모르겠지만 항상 추가해주고 프로그램을 작성하도록 하자. 그리고 헤더파일의 순서가 바뀌는 것만으로도 xv6가 잘 실행되지 않을 수도 있으니 순서도 중요하게 생각하고 작성해야한다.
새로운 system call을 작성하게 되면 수정해줘야할 부분이 여러가지가 있다. 운영체제 전역에 해당 system call이 새로 생겨 사용할 수 있게 해주기 위한 “선언” 정도라고 생각하면 좋을 것 같다.
defs.h
//prac_syscall.c
int myfunction(char*);
나중에 수정할 때 헛갈리지 않도록 어느 파일에 들어있는 system call인지 주석으로 처리해주고, 아래에 내가 사용할 system call을 모양 그대로 선언해 추가 해준다.
user.h
int myfunction(char*);
user mode에서 사용할 수 있게 하는듯하다.