System Calls만 해결하면 다른 문제는 간단하게 해결되는 듯 (그래도 어렵지만)
터미널로부터 받은(실행 시킨) 메세지를 parsing 하여 filename을 얻은 뒤, 그 프로그램을 load 하고 실행시켜야 함. 그러나 system call 부분이 구현되어 있지 않아서 hex_dupm를 통해 User stack에 데이터가 잘 들어갔는지만 확인.
유저 메모리 접근 구현
system call 구현
구현 해야 할 기능 간략 설명
void halt (void);
PintOS 종료.
void exit (int status);
현재 user program 종료.
pid_t fork (const char *thread_name);
현재 프로세스의 복제본인 새 프로세스를 만듦.
int exec (const char *cmd_line);
프로세스 실행.
int wait (pid_t pid);
자식 프로세스가 종료 될 때까지 기다림.
bool create (const char *file, unsigned initial_size);
initial_size 크기인 file을 생성.
bool remove (const char *file);
file 삭제.
int open (const char *file);
file open.
int filesize (int fd);
file size return.
int read (int fd, void *buffer, unsigned size);
열린 file의 Data를 read함.
int write (int fd, const void *buffer, unsigned size);
열린 file에 Data를 write함.
void seek (int fd, unsigned position);
열린 파일의 offset을 position만큼 이동.
unsigned tell (int fd);
열린 파일의 offset을 알려줌.
void close (int fd);
열린 파일을 닫음.
lib/user/syscall.c를 보면 어셈블리 명령을 보내는 코드가 작성되어있다.
(static __inline int64_t syscall)
작성되어 있는 기능의 함수를 호출하면 syscall을 통해 어셈블리 명령을 하게 되고 그 결과 넘어 온 intr_frame을 가지고 syscall_handler에서 해당 기능 처리 한다.
프로세스가 종료 되었을 때 해당 프로세스 이름 및 종료 출력하기
실행 파일에 대한 쓰기 거부하기.
File Descriptor가 같은 File을 Open(참조)한 상태로 만들기.
여러 코드를 참고하여 학습 및 테스트 통과는 하였지만 저 같은 경우에는 아직 이해도 겨우 하는 수준입니다. project 3부터는 더 힘겨울 것 같습니다. 이번 같은 팀 조원들 정말 고생하셨습니다!