
2025.05.22
exec(file) 호출 → SYS_EXEC ,file 담고 syscall 실행process_exec(void *f_name) 수행case SYS_EXEC:
{
char *file_name = (char *)f->R.rdi;
check_user_address(file_name);
check_user_buffer(file_name, strlen(file_name) + 1);
char *kpage = palloc_get_page(PAL_USER | PAL_ZERO);
if (!kpage)
sys_exit(-1);
// f->R.rax = -1;
else
{
strlcpy(kpage, file_name, PGSIZE);
// f->R.rax = process_exec(kpage);
/* process_exec이 성공하면 여기로 돌아오지 않음.
실패 시 -1을 반환하므로, 즉시 종료. */
process_exec(kpage);
sys_exit(-1);
}
break;
}
exec의 경우, process_exec를 수행하게 되면 돌아오지 않고, 실패 시 -1을 반환한다.
실패해서 종료해야하는 경우, rax에 반환이 아닌 exit를 해주어야 함
fork(thread_name) 호출 → 레지스터에 SYS_FORK와 thread_name 포인터를 담고 syscall 실행process_fork(const char *name, struct intr_frame *if_) 수정 필요1) fork 로 자식 생성 → 2) wait 로 자식 종료 대기 → 3) exit 으로 자식 종료 통보 → 4) exec 로 (필요 시) 프로세스 이미지 교체
process_fork(), process_wait(), process_exit() 수정 필요
thread 구조체
/* process의 부모 자식 관계를 위한 변수 추가*/
struct list children; // struct child_status elem 들의 리스트
tid_t parent_tid; // 나의 부모를 기록
int exit_status; // exit()를 위한 자신의 종료 상태
/* 자식 프로세스 상태를 기록할 구조체 */
struct child_status
{
tid_t tid; /* 자식 스레드/프로세스 id */
int exit_status; /* 자식이 exit() 에서 넘긴 상태 코드 */
bool has_exited; /* exit() 이 이미 호출되었는지 */
struct semaphore sema; /* 부모가 대기(sema_down)할 세마포어 */
struct list_elem elem; /* 부모의 children 리스트 항목 연결자 */
};
----
init_thread()
추가한 변수들 초기화 수행
/* pid 및 자식 리스트 초기화*/
t->parent_tid = TID_ERROR;
list_init(&t->children);
printf("%s: exit(%d)\n", ...)thread_by_tid(parent_tid) 로 부모 스레드를 찾고,children 리스트 중 c->tid == curr->tid 인 항목을 찾아c->exit_status 와 c->has_exited 를 설정한 후 sema_up(&c->sema) 호출file_close()process_cleanup() 에서 페이지 디렉토리 등 나머지 리소스 해제내일 게시글에 이어서 구현해야지. fork 너무 어렵다.