x86-64 기반 Pint OS 프로젝트 2의 System Calls를 구현하기 위해 공부한 개념을 정리한다.
exec
정의
int exec (const char *cmd_line);
현재 실행 중인 프로세스를 cmd_line으로 주어진 실행 파일로 바꾼다. exec 함수가 성공하면 리턴되지 않는다. 어떤 오류가 발생해서 실패한다면 exit (-1)을 호출해서 현재 프로세스를 종료시킨다. exec 함수는 현재 실행 중인 프로세스(스레드)의 이름을 바꿀 필요는 없다. exec 함수를 호출해도 fd(file decriptor)는 열린 상태를 유지한다!
구현 시 어려웠던 점
exec 시스템 콜의 정의를 이해하기 어려웠다. 자식 프로세스를 새로 만들어서 실행 파일을 실행시키는 건지, 아니면 현재 프로세스를 덮어 씌우고 실행하는 건지 해석이 난해했다. 특히 Pint OS의 학습 자료 중 한양대 핀토스 강의 자료에서는 exec가 fork 기능을 포함하고 있어서 더욱 헷갈렸다. 그러나 exec와 fork를 분리시키는 것이 정답이었다.
프로세스를 실행시키는 함수를 직접 구현해야 하나 걱정했었는데, process_exec() 함수를 사용하면 된다.
구현은 다 했었는데 계속해서 터져버려서 원인을 찾아보니 palloc 선언을 안 해줬다...
// userprog/syscall.c
#include "filesys/filesys.h"
exec ()
// userprog/syscall.c
int
exec (const char *cmd_line) {
check_address (cmd_line);
char *file_name = (char *)palloc_get_page (PAL_ZERO);
if (file_name == NULL)
exit (-1);
memcpy (file_name, cmd_line, strlen (cmd_line)+1);
if (process_exec (file_name) == -1)
exit (-1);
}
- 먼저 유저 프로그램에게서 받은 인자 cmd_line이 유효(valid)한지 체크한다.
- cmd_line은 유저 영역에 존재하지만, file_name은 커널 영역에 생성해주어야 한다.
- 따라서 palloc 라이브러리로 새 페이지를 할당한 후 cmd_line을 복사시켜 준다.
- process_exec (file_name)을 호출한다.
- 성공하면 리턴되지 않을 것이고, 실패하면 리턴받고 exit (-1)으로 바로 종료된다.
출처
'프로젝트 > Pint OS' 카테고리의 다른 글
[Pint OS] System Calls (5) (1) | 2023.06.14 |
---|---|
[Pint OS] System Calls (4) (0) | 2023.06.11 |
[Pint OS] System Calls (2) (0) | 2023.06.11 |
[Pint OS] 에러: missing "begin" message (0) | 2023.06.09 |
[Pint OS] System Calls (1) (0) | 2023.06.07 |