회고
어제 하루 종일 매달렸던 문제를 간신히 해결했다. 원인을 알 수 없어서 이전 깃 푸쉬 내역으로 롤백하고 거기서 부터 다시 구현하다가 process_wait ()에서 시간을 많이 주니까 통과되더라... 너무 허탈했다.
fork와 wait 시스템 콜을 바로 하기는 어려울 것 같아서 exec 부터 먼저 구현해보기로 했다. 2시간 정도 걸린 것 같다. exec 시스템 콜이 fork를 써야 하는 줄 알았는데 그건 아니었다. exec는 실행하고 싶은 파일명을 인자로 담아 호출하면 현재 실행 중인 프로그램을 새 실행 파일이 대체하는 시스템 콜이다. 따라서 커널 영역에 파일 이름에 대한 공간만 할당해주고 process_exec (file_name)을 호출하면 끝이다! 프로그램을 실행시키는 process_exec () 함수가 이미 제공되었어서 이 부분에서 어려운 것은 없었지만, 일반적인 동적 메모리 할당을 사용할 수 없어서 파일 이름에 대한 공간을 할당해주는데 어려움이 있었다. 그러나 이것도 Pint OS에서 제공해주는 palloc 라이브러리를 사용하면 간단하다!
- exec () 시스템 콜
int
exec (const char *cmd_line) {
check_address (cmd_line);
char *file_name = (char *)palloc_get_page (PAL_ASSERT);
if (file_name == NULL)
exit (-1);
memcpy (file_name, cmd_line, strlen (cmd_line)+1);
if (process_exec (file_name) == -1) {
exit (-1);
}
}
주의할 점은 syscall.c에 palloc 라이브러리에 대한 include가 명시되지 않았기 때문에 직접 적어줘야 한다! 빼먹으면 알 수 없는 커널 패닉에 빠진다.
오늘의 저녁
'크래프톤 정글 2기' 카테고리의 다른 글
[크래프톤 정글 2기] Day 70 (0) | 2023.06.12 |
---|---|
[크래프톤 정글 2기] Day 69 (0) | 2023.06.11 |
[크래프톤 정글 2기] Day 67 (0) | 2023.06.09 |
[크래프톤 정글 2기] Day 66 (0) | 2023.06.08 |
[크래프톤 정글 2기] Day 65 (0) | 2023.06.07 |